総目次

総目次(MLｱｾﾝﾌﾞﾗ ﾍﾙﾌﾟ Ver 0.8)

本ﾍﾙﾌﾟ･ﾌｧｲﾙの記述規則

§1 MASM記述規則

 1. ｿｰｽ･ﾌｧｲﾙの基本形式
  1.1 文(ｽﾃｰﾄﾒﾝﾄ)
  1.2 ｼﾝﾎﾞﾙ
  1.3 全体構成
  1.4 ｾｸﾞﾒﾝﾄ定義の概要
  1.5 簡略化ｾｸﾞﾒﾝﾄ定義の概要
  1.6 ｸﾞﾙｰﾌﾟ定義
  1.7 手続きの記述の概要
  1.8 分岐と局所ﾗﾍﾞﾙ
  1.9 ﾏｲｸﾛﾌﾟﾛｾｯｻの指定

 2. ﾃﾞｰﾀ形式
  2.1 固定小数点と浮動小数点
  2.2 整数
  2.3 ﾎﾟｲﾝﾀ
  2.4 BCD
  2.5 ｼｮｰﾄ･ﾘｱﾙ
  2.6 ﾛﾝｸﾞ･ﾘｱﾙ
  2.7 ﾃﾝﾎﾟﾗﾘ･ﾘｱﾙ

 3. ﾃﾞｰﾀの定義と領域確保
  3.1 整数値
  3.2 実数値
  3.3 文字列
  3.4 ｱﾄﾞﾚｽ(ｾｸﾞﾒﾝﾄとｵﾌｾｯﾄ)
  3.5 未初期化
  3.6 複数領域の確保
  3.7 構造体と共用体
  3.8 ﾚｺｰﾄﾞ
  3.9 ｱﾄﾞﾚｽとﾗべﾙ関係の操作

 4. ｾｸﾞﾒﾝﾄと手続き
  4.1 簡略化ｾｸﾞﾒﾝﾄの記述
  4.2 完全なｾｸﾞﾒﾝﾄの記述
  4.3 手続きの記述

 5. 等価記号
  5.1 等号(=)による定数定義
  5.2 EQU文による定数定義
  5.3 ﾃｷｽﾄ･ﾏｸﾛの定義と評価
  5.4 ﾃｷｽﾄの操作
  5.5 定義済みﾃｷｽﾄ･ﾏｸﾛ

 6. ﾏｸﾛ
  6.1 ﾏｸﾛ手続き
  6.2 繰り返しﾏｸﾛ
  6.3 ﾏｸﾛ関数
  6.4 ﾏｸﾛ演算子
  6.5 ﾏｸﾛの特殊な定義

 7. 演算子
  7.1 算術演算子
  7.2 型演算子
  7.3 構造体ﾌｨｰﾙﾄﾞ名演算子
  7.4 ﾚｺｰﾄﾞ演算子
  7.5 ｲﾝﾃﾞｯｸｽ演算子
  7.6 ｼﾌﾄ演算子
  7.7 ﾋﾞｯﾄ論理演算子
  7.8 関係演算子

 8. ｱｾﾝﾌﾞﾙの制御
  8.1 ｿｰｽ･ﾌｧｲﾙのｲﾝｸﾙｰﾄﾞ
  8.2 条件付きｱｾﾝﾌﾞﾙ
  8.3 条件付きｴﾗｰ
  8.4 ﾘｽﾄ制御
  8.5 命令生成ﾃﾞｨﾚｸﾃｨﾌﾞ
  8.6 その他のｱｾﾝﾌﾞﾙ制御

 9. ﾓｼﾞｭｰﾙ間の参照と共有変数
  9.1 ｼﾝﾎﾞﾙの参照
  9.2 共有変数

10. OPTION文
11. 80386/80486指定の場合
12. 予約語一覧

§2 操作規則

 1. MLｺﾏﾝﾄﾞ

 2. LINKｺﾏﾝﾄﾞ
  2.1 LINKのｵﾌﾟｼｮﾝ

 3. NMAKE/NMKｺﾏﾝﾄﾞ
  3.1 記述ﾌﾞﾛｯｸ
  3.2 ﾏｸﾛ
  3.3 推論規則
  3.4 ﾃﾞｨﾚｸﾃｨﾌﾞ
  3.5 記述ﾌｧｲﾙの例
  3.6 ﾌｧｲﾙT00LS.INI

 4. LlBｺﾏﾝﾄﾞ
 5. ILINKｺﾏﾝﾄﾞ
 6. BlNDｺﾏﾝﾄﾞ
 7. CV(CVP)ｺﾏﾝﾄﾞ
 8. CVPACKｺﾏﾝﾄﾞ
 9. EXEHDRｺﾏﾝﾄﾞ
10. H2INCｺﾏﾝﾄﾞ
11. lMPLlBｺﾏﾝﾄﾞ
12. PWBｺﾏﾝﾄﾞ
13. PWBRMAKEｺﾏﾝﾄﾞ
14. QHｺﾏﾝﾄﾞ
15. HELPMAKEｺﾏﾝﾄﾞ
16. MASMｺﾏﾝﾄﾞ
17. EXP,RM,UNDELｺﾏﾝﾄﾞ

§3 補足
 1. ｱｾﾝﾌﾞﾗの制限
 2. MASM Ver5.1との対応


本ﾍﾙﾌﾟ･ﾌｧｲﾙの記述規則

ｺﾏﾝﾄﾞの一般形などで表記の{ }で示されている内容は省略可能な部分を表します。通常の{ }と区別して下さい。…は項目などの繰り返しを表し、説明上で何かが存在しなければならないが、何でもよい場合などにも使用しています。

 一般的に赤字の部分は、ﾎﾟｲﾝﾄとなる部分や特定の記号で表示上判別し難い場合などに使用しています。


記述規則目次

§1 記述規則目次

本ﾍﾙﾌﾟ･ﾌｧｲﾙの記述規則

1. ｿｰｽ･ﾌｧｲﾙの基本形式
 1.1 文(ｽﾃｰﾄﾒﾝﾄ)
 1.2 ｼﾝﾎﾞﾙ
 1.3 全体構成
 1.4 ｾｸﾞﾒﾝﾄ定義の概要
 1.5 簡略化ｾｸﾞﾒﾝﾄ定義の概要
 1.6 ｸﾞﾙｰﾌﾟ定義
 1.7 手続きの記述の概要
 1.8 分岐と局所ﾗﾍﾞﾙ
 1.9 ﾏｲｸﾛﾌﾟﾛｾｯｻの指定

2. ﾃﾞｰﾀ形式
 2.1 固定小数点と浮動小数点
 2.2 整数
 2.3 ﾎﾟｲﾝﾀ
 2.4 BCD
 2.5 ｼｮｰﾄ･ﾘｱﾙ
 2.6 ﾛﾝｸﾞ･ﾘｱﾙ
 2.7 ﾃﾝﾎﾟﾗﾘ･ﾘｱﾙ

3. ﾃﾞｰﾀの定義と領域確保
 3.1 整数値
 3.2 実数値
 3.3 文字列
 3.4 ｱﾄﾞﾚｽ(ｾｸﾞﾒﾝﾄとｵﾌｾｯﾄ)
 3.5 未初期化
 3.6 複数領域の確保
 3.7 構造体と共用体
 3.8 ﾚｺｰﾄﾞ
 3.9 ｱﾄﾞﾚｽとﾗべﾙ関係の操作

4. ｾｸﾞﾒﾝﾄと手続き
 4.1 簡略化ｾｸﾞﾒﾝﾄの記述
 4.2 完全なｾｸﾞﾒﾝﾄの記述
 4.3 手続きの記述

5. 等価記号
 5.1 等号(=)による定数定義
 5.2 EQU文による定数定義
 5.3 ﾃｷｽﾄ･ﾏｸﾛの定義と評価
 5.4 ﾃｷｽﾄの操作
 5.5 定義済みﾃｷｽﾄ･ﾏｸﾛ

6. ﾏｸﾛ
 6.1 ﾏｸﾛ手続き
 6.2 繰り返しﾏｸﾛ
 6.3 ﾏｸﾛ関数
 6.4 ﾏｸﾛ演算子
 6.5 ﾏｸﾛの特殊な定義

7. 演算子
 7.1 算術演算子
 7.2 型演算子
 7.3 構造体ﾌｨｰﾙﾄﾞ名演算子
 7.4 ﾚｺｰﾄﾞ演算子
 7.5 ｲﾝﾃﾞｯｸｽ演算子
 7.6 ｼﾌﾄ演算子
 7.7 ﾋﾞｯﾄ論理演算子
 7.8 関係演算子

8. ｱｾﾝﾌﾞﾙの制御
 8.1 ｿｰｽ･ﾌｧｲﾙのｲﾝｸﾙｰﾄﾞ
 8.2 条件付きｱｾﾝﾌﾞﾙ
 8.3 条件付きｴﾗｰ
 8.4 ﾘｽﾄ制御
 8.5 命令生成ﾃﾞｨﾚｸﾃｨﾌﾞ
 8.6 その他のｱｾﾝﾌﾞﾙ制御

9. ﾓｼﾞｭｰﾙ間の参照と共有変数
 9.1 ｼﾝﾎﾞﾙの参照
 9.2 共有変数

10. OPTION文
11. 80386/80486指定の場合
12. 予約語一覧


ｿｰｽ･ﾌｧｲﾙの基本形式

1. ｿｰｽ･ﾌｧｲﾙの基本形式

ｱｾﾝﾌﾞﾘ言語のﾌﾟﾛｸﾞﾗﾑを作成する最初の手順として、ｿｰｽ･ﾌｧｲﾙ(source file)を作成する必要があります。これには、ｴﾃﾞｨﾀ(editor)と呼ばれるﾃｷｽﾄ･ﾌｧｲﾙ(text file)編集用のﾌﾟﾛｸﾞﾗﾑを使用します。なお、PWB(Programmer's WorkBench)でも、ｿｰｽ･ﾌｧｲﾙの作成･編集ができます。

 ｿｰｽ･ﾌｧｲﾙは、これをｱｾﾝﾌﾞﾙ(assemble)するﾌﾟﾛｸﾞﾗﾑ、すなわちｱｾﾝﾌﾞﾗ(assembler)の規則に従って記述します。ｿｰｽ･ﾌｧｲﾙの基本的な構成要素は、文(statement)と呼ばれる行です。ｿｰｽ･ﾌｧｲﾙは複数の行から構成されますが、文を複数の行に分割はできません。ただし、円記号\を用いれば、複数行からなる文を記述できます。この場合、ｺﾒﾝﾄ(注釈)や文字列に含まれる場合を除いて、行の最後に\を置くことで、次の行に文が継続します。この場合の改行で区切られた行を物理行、文を構成する行を論理行と呼びます。次の例のように、論理行は複数の物理行を含む場合があります。
例:
EXTERN sub1,sub2, \
;ｺﾒﾝﾄの記述も可能です。
       sub3,sub4

ｱｾﾝﾌﾞﾗではｺﾒﾝﾄを除き、文の記述には次に示す英字、数字、記号で構成される文字ｾｯﾄ(character set)を使用します。ただし、これ以外に、ｽﾍﾟｰｽ(space:20H)、ﾀﾌﾞ(tab:09H)、改行(0DH、0AH)のｺｰﾄﾞが含まれます。
A B C D E F G H I J K L M N 0 P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
! " # $ % & ' { } * + , - . / : ; < = > ? @ [ \ ] ^ _ { | } ~
特殊な場合を除いて、ｱｾﾝﾌﾞﾙ処理では英字の小文字は自動的に大文字に変換されます。ｺﾒﾝﾄや文字列定数では、上記以外の表示可能な任意の文字も使用でき、大文字、小文字は区別されます。

1.1 文(ｽﾃｰﾄﾒﾝﾄ)
1.2 ｼﾝﾎﾞﾙ
1.3 全体構成
1.4 ｾｸﾞﾒﾝﾄ定義の概要
1.5 簡略化ｾｸﾞﾒﾝﾄ定義の概要
1.6 ｸﾞﾙｰﾌﾟ定義
1.7 手続きの記述の概要
1.8 分岐と局所ﾗﾍﾞﾙ
1.9 ﾏｲｸﾛﾌﾟﾛｾｯｻの指定


文(ｽﾃｰﾄﾒﾝﾄ)

1.1 文(ｽﾃｰﾄﾒﾝﾄ)

文は、次の形式で記述します。各部(ﾌｨｰﾙﾄﾞ)は記述の順序が規定されますが、すべてが必須ではなく、必要に応じて記述します。各部は、1個以上のｽﾍﾟｰｽまたはﾀﾌﾞで区切ります。何も存在しない空文(改行だけの文)も許されます。空白行はﾌﾟﾛｸﾞﾗﾑを見やすくするために利用します。
■ 定義･宣言文の一般形
{name}   {operation} {operand} {; comment}
■ 命令文の一般形
{name:}  {operation} {operand} {; comment}
{name::} {operation} {operand} {; comment}

■ name (ﾈｰﾑ、ｼﾝﾎﾞﾙ、ﾗﾍﾞﾙ)

この文が、他の文から参照される場合の識別名を記述します。通常、この識別名はｱﾄﾞﾚｽ(番地)を表わしますが、ｱﾄﾞﾚｽの値だけでなく、ｻｲｽﾞなどの属性も保持します。ﾃﾞｰﾀ領域のｱﾄﾞﾚｽでは定数名、変数名、命令のｱﾄﾞﾚｽではﾗﾍﾞﾙ(label)とも呼ばれます。ﾗﾍﾞﾙ定義の場合は、識別名の直後に:(ｺﾛﾝ)を付加しますが、以下のようなｺﾛﾝの数によって参照可能な範囲が異なります。
label: OPTION文のNOSCOPED/SCOPEDの影響を受けます。
OPTION NOSCOPED指定では、このﾗﾍﾞﾙはﾓｼﾞｭｰﾙ(1個のｿｰｽ･ﾌｧｲﾙ)中でｸﾞﾛｰﾊﾞﾙ(global:大域的)で、ﾊﾟﾌﾞﾘｯｸ(public)宣言が可能です。逆に、OPTI0N SCOPED指定では、このﾗﾍﾞﾙは、定義されているﾌﾟﾛｼｰｼﾞｬ(procedure:手続き)中ではﾛｰｶﾙ(local:局所的)、ﾓｼﾞｭｰﾙ中ではｸﾞﾛｰﾊﾞﾙですが、ﾊﾟﾌﾞﾘｯｸ宣言はできません。
label:: OPTION文のNOSCOPED/SCOPEDの影響を受けません。
OPTION SCOPED指定の影響を受けず、このﾗﾍﾞﾙは常にﾓｼﾞｭｰﾙ中でｸﾞﾛｰﾊﾞﾙで、ﾊﾟﾌﾞﾘｯｸ宣言できます。ﾃﾞﾌｫﾙﾄ(既定値)はOPTION SCOPEDですが、OPTION M510が指定されていると、ﾃﾞﾌｫﾙﾄはOPTION NOSCOPEDに設定されます。

 ■ operation (ｵﾍﾟﾚｰｼｮﾝ)

ﾏｲｸﾛﾌﾟﾛｾｯｻの実行命令、または定義命令や各種の宣言などの指示(ﾃﾞｨﾚｸﾃｨﾌﾞ)を表わすﾆﾓﾆｯｸを記述します。この部分が基本となり、nameとoperandの必要性や型が決まります。ﾗﾍﾞﾙやｺﾒﾝﾄのみの行や、空白行以外では必須となります。

 ■ operand (ｵﾍﾟﾗﾝﾄﾞ)

ｵﾍﾟﾚｰｼｮﾝ部の記述内容に従って、必要なｵﾍﾟﾗﾝﾄﾞを記述します。,(ｶﾝﾏ)またはｽﾍﾟｰｽで区切って複数の項目が記述される場合もあります。

 ■ comment (ｺﾒﾝﾄ、注釈)

必ず先頭に;(ｾﾐｺﾛﾝ)を伴い、ｺﾒﾝﾄの記述に使用されます。ｱｾﾝﾌﾞﾙ時には常に内容が無視されます。

 複数の物理行にわたるｺﾒﾝﾄを記述する場合は、次のCOMMENT文を使用します。
COMMENT x ｺﾒﾝﾄ1
ｺﾒﾝﾄ2
…
x ｺﾒﾝﾄn
注: この行全体までがｺﾒﾝﾄとみなされます。
xは、COMMENTの直後の(ｽﾍﾟｰｽやﾀﾌﾞなどの区切りとなる文字を除く)1文字で、次に同じ文字xが含まれる行全体までをｺﾒﾝﾄとみなします。


ｼﾝﾎﾞﾙ

1.2 ｼﾝﾎﾞﾙ

文のﾈｰﾑ部などで使用される名前を表わす記号をｼﾝﾎﾞﾙと呼びます。ｼﾝﾎﾞﾙは英数字(英字と数字)で構成しますが、次の制限があります。
■ | ｼﾝﾎﾞﾙを構成する文字列中に、ｽﾍﾟｰｽなどの区切り文字記号を入れられません。また、有効な長さは先頭から最大247文字までです。これより長いとｴﾗｰとなります。
■ | 英字の小文字は大文字に変換され、英字の大小は区別されません。ただし、ｱｾﾝﾌﾞﾙ時に特定のｵﾌﾟｼｮﾝを指定した場合は異なります。
■ | 数値と区別するため、先頭に数字を使用できません。従って英字で始まる英数字で構成します。
■ | 英数字以外では、@(ｱｯﾄ･ﾏｰｸ)、_(ｱﾝﾀﾞｰ･ﾗｲﾝ)、$(ﾄﾞﾙ記号)、?(疑問符)が英字と同様に使用できますが、$と?は単独では使用できません。また、ｱｾﾝﾌﾞﾗが自動的に生成するｼﾝﾎﾞﾙもありますので、混乱しないよう注意が必要です。
■ | ｱｾﾝﾌﾞﾗの予約語は使用できません。ただし、例外的な使用に関しては、0PTI0N N0KEYW0RDを参照して下さい。
■ | ｿｰｽ･ﾌｧｲﾙ内で同一のｼﾝﾎﾞﾙ名を複数定義してはいけません。ただし、特別な場合を除いて、他のｿｰｽ･ﾌｧｲﾙに含まれるｼﾝﾎﾞﾙと同じｼﾝﾎﾞﾙ名となっても問題ありません。


全体構成

1.3 全体構成

通常、ﾌﾟﾛｸﾞﾗﾑは複数のｾｸﾞﾒﾝﾄで構成されます。ｾｸﾞﾒﾝﾄは連続したｺｰﾄﾞまたはﾃﾞｰﾀの論理的な集りです。ｱｾﾝﾌﾞﾗのｿｰｽ･ﾌｧｲﾙの基本的な全体構成を次に示します。
{各種宣言}
ｾｸﾞﾒﾝﾄ定義
ｾｸﾞﾒﾝﾄ定義
  …
  END
必要ならば宣言に続いて、複数のｾｸﾞﾒﾝﾄを定義し、最後にEND文を記述します。END文にはﾌﾟﾛｸﾞﾗﾑの実行開始ｱﾄﾞﾚｽを指定できます。実行開始ｱﾄﾞﾚｽは、ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ内で定義されているﾗﾍﾞﾙかｱﾄﾞﾚｽと等価な式(expression)です。COM形式を除いて、任意の位置の実行命令の位置を指定できます。結果として、これはﾌﾟﾛｸﾞﾗﾑ実行時のCSとIP(EIP)の初期値を設定します。複数のｿｰｽ･ﾌｧｲﾙから1つのﾌﾟﾛｸﾞﾗﾑが構成されている場合は、どれか1つのｿｰｽ･ﾌｧｲﾙでだけ実行開始ｱﾄﾞﾚｽを指定します。実行開始ｱﾄﾞﾚｽが、まったく指定されていない場合や、複数のｿｰｽ･ﾌｧｲﾙで指定されている場合、正常な動作が保証されません。

 ■ END文

 次にEND文の一般形を示します。
END
{実行開始ｱﾄﾞﾚｽ}
END文は、ｿｰｽ･ﾌｧｲﾙの記述の最後を表わします。従ってｿｰｽ･ﾌｧｲﾙには、必ず1個のEND文が必要です。また、END文よりも後に記述されている行の内容は、基本的に無視されます。


ｾｸﾞﾒﾝﾄ定義の概要

1.4 ｾｸﾞﾒﾝﾄ定義の概要

ｿｰｽ･ﾌｧｲﾙでの1つのｾｸﾞﾒﾝﾄ定義の一般形を次に示します。通常、多くのﾌﾟﾛｸﾞﾗﾑでは、複数のｾｸﾞﾒﾝﾄを定義することになります。
sname
SEGMENT
{ｾｸﾞﾒﾝﾄ属性}
文
…
文
sname ENDS

■ SEGMENT文,ENDS文

SEGMENT文とENDS文で、ｾｸﾞﾒﾝﾄに含まれる文を指定します。snameはｾｸﾞﾒﾝﾄ名を示します。同じｿｰｽ･ﾌｧｲﾙ内の同一ｾｸﾞﾒﾝﾄ名は、その記述順序で連続しているものとして扱われますが、ｾｸﾞﾒﾝﾄ属性も一致していなければなりません。このように、ｾｸﾞﾒﾝﾄは分割して記述もできます。通常、最初のｾｸﾞﾒﾝﾄ記述でｾｸﾞﾒﾝﾄ属性を指定し、以後は属性を省略します。

 ｾｸﾞﾒﾝﾄ属性には、ｾｸﾞﾒﾝﾄの先頭ｱﾄﾞﾚｽの境界(任意のﾊﾞｲﾄ、偶数ｱﾄﾞﾚｽのﾜｰﾄﾞ、4倍ｱﾄﾞﾚｽのﾀﾞﾌﾞﾙﾜｰﾄﾞなど)、他のｿｰｽ･ﾌｧｲﾙに同一ｾｸﾞﾒﾝﾄ名が存在する場合の結合方法、ﾌﾟﾛｸﾞﾗﾑが複数のｾｸﾞﾒﾝﾄで構成される場合のｾｸﾞﾒﾝﾄの配置順序、更に80386/80486では、ｾｸﾞﾒﾝﾄのﾃﾞﾌｫﾙﾄのﾜｰﾄﾞ･ｻｲｽﾞ(16ﾋﾞｯﾄまたは32ﾋﾞｯﾄ)を指定できます。
分類 | 主目的 | 補助目的 | ｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ
ｺｰﾄﾞ | 実行命令の記述 | ﾃﾞｰﾀ用 | CS
ﾃﾞｰﾀ | ﾃﾞｰﾀ用(定数、変数) |  | DS, ES, FS, GS
ｽﾀｯｸ | ｽﾀｯｸ領域、一時変数 |  | SS
ｾｸﾞﾒﾝﾄの種類を目的によって大別すると、上記のように分類でき、通常のﾌﾟﾛｸﾞﾗﾑでは、これら3種類のｾｸﾞﾒﾝﾄが必要です。従って、最低3個のｾｸﾞﾒﾝﾄ定義が使用されることになります。これらの区別は、次のようにして行なわれます。
① | END文の実行開始ｱﾄﾞﾚｽで指定されたﾗﾍﾞﾙを含むｾｸﾞﾒﾝﾄはｺｰﾄﾞ･ｾｸﾞﾒﾝﾄです。END文の指定で、CSとIP(EIP)の初期値が設定されます。このCSは、ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄを定義します。
② | ｾｸﾞﾒﾝﾄの属性で、STACKを指定されたものは、ｽﾀｯｸ･ｾｸﾞﾒﾝﾄです。この場合、EXE形式では自動的に実行時のSSとSP(ESP)の初期値が設定されます。STACK指定のｾｸﾞﾒﾝﾄが存在しないとき、COM形式などの特別な場合を除いて、ﾌﾟﾛｸﾞﾗﾑの実行開始時にSSとSP(ESP)に適当な値を設定する必要があります。
③ | 上記以外のｾｸﾞﾒﾝﾄは、属性が指定されていなければ、ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄまたはﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄの可能性があります。通常、ｾｸﾞﾒﾝﾄの属性で、いずれであるかを定義します。
④ | ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄのｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀの値は、特別な場合を除いて、ﾌﾟﾛｸﾞﾗﾑ中で設定する必要があります。
ｾｸﾞﾒﾝﾄの記述順序に制限はありませんが、実行時のｾｸﾞﾒﾝﾄ割り当てでは、標準的な順序が決められている場合があります。ｱｾﾝﾌﾞﾘ言語だけのﾌﾟﾛｸﾞﾗﾑでは、特にｾｸﾞﾒﾝﾄの配置順序を意識する必要はありません。

 ■ ASSUME文

 ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄの定義では、命令で使用するｾｸﾞﾒﾝﾄに関連付けられているｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ(ｾﾚｸﾀ)を宣言する必要があります。これは、参照ｾｸﾞﾒﾝﾄに対するﾃﾞﾌｫﾙﾄのｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ(ｾﾚｸﾀ)の指定を意味し、次のASSUME文で宣言します。
      ASSUME
sreg:sname{,sreg:sname,…}
      ASSUME
NOTHING
sregはｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ名(CS, DS, ES, SS, FS, GS)です。snameはｾｸﾞﾒﾝﾄ名、GROUP文で定義されたｸﾞﾙｰﾌﾟ名、またはこれらと等価な式、あるいは以前の指定を取消すためのNOTHINGのいずれかです。2行目の形式では、すべての指定が取り消されます。記述された位置から、この宣言が有効となります。命令で、あるｾｸﾞﾒﾝﾄが参照されると、ASSUME文で宣言されているｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ(ｾﾚｸﾀ)が仮定され、必要に応じてｾｸﾞﾒﾝﾄ変更ﾌﾟﾚﾌｨｯｸｽが自動的に挿入されます。また、途中でﾃﾞﾌｫﾙﾄを変更する場合も、ASSUME文を使用します。次に具体的なASSUME文の例を示します。
例:
  ASSUME CS:_TEXT,DS:_DATA,SS:_STACK,ES:NOTHING

■ ﾌﾟﾛｸﾞﾗﾑの終了

 ﾌﾟﾛｸﾞﾗﾑの実行を終了するには、実行権をOSに返します。MS-DOSでは、次の命令ｼｰｹﾝｽを用いるのが一般的です。
       MOV  AL,0
終了ｺｰﾄﾞ0
       MOV  AH,4CH
ﾌﾟﾛｸﾞﾗﾑ実行終了を指定
       INT  21H
ﾌﾟﾛｸﾞﾗﾑ終了(DOSﾌｧﾝｸｼｮﾝ･ｺｰﾙ)
終了ｺｰﾄﾞは、ﾌﾟﾛｸﾞﾗﾑがﾊﾞｯﾁ･ﾌｧｲﾙなどで起動されている場合などに参照できます。この命令ｼｰｹﾝｽを実行すると、OSからは戻りません。次は簡単なMS-DOSのEXE形式のﾌﾟﾛｸﾞﾗﾑ例です。
_STACK SEGMENT STACK
ｽﾀｯｸ･ｾｸﾞﾒﾝﾄ開始宣言
       WORD    128 DUP (?)
ｽﾀｯｸ領域256ﾊﾞｲﾄ確保
_STACK ENDS
ｽﾀｯｸｾｸﾞﾒﾝﾄ終了宣言
;
_TEXT  SEGMENT
ｺｰﾄﾞｾｸﾞﾒﾝﾄ開始宣言
       ASSUME  CS:_TEXT
CSﾚｼﾞｽﾀはｺｰﾄﾞｾｸﾞﾒﾝﾄを基準にｱｾﾝﾌﾞﾙ
START: MOV     AL,0
終了ｺｰﾄﾞを0に設定
       MOV     AH,4CH
ﾌﾟﾛｸﾞﾗﾑ終了を指定
       INT     21H
ﾌﾟﾛｸﾞﾗﾑの実行を終了
_TEXT  ENDS
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ終了宣言
;
       END     START
ｿｰｽ･ﾌｧｲﾙ終了宣言

■ ｾｸﾞﾒﾝﾄ変更演算子

 ｾｸﾞﾒﾝﾄ変更演算子(segment override operator)のCS:, DS:, ES:, FS:, GS:, SS:を対象ｵﾍﾟﾗﾝﾄﾞの直前に記述して、個々の命令でのｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ(ｾﾚｸﾀ)をﾃﾞﾌｫﾙﾄから変更することもできます。この場合、命令で変更可能なｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀは特定のｵﾍﾟﾗﾝﾄﾞに固定されているために、命令の直前にｾｸﾞﾒﾝﾄ変更演算子を記述することも可能です。ｾｸﾞﾒﾝﾄ変更演算子の使用例を次に示します。これを用いると、ASSUME文の指定は無視され、指定のｾｸﾞﾒﾝﾄに固定されます。
例:
  MOV AX,SS:[SI]
ﾃﾞﾌｫﾙﾄのDSをSSに変更
  ADD ES:[BP+DI],DX
ﾃﾞﾌｫﾙﾄのSSをESに変更


簡略化ｾｸﾞﾒﾝﾄ定義の概要

1.5 簡略化ｾｸﾞﾒﾝﾄ定義の概要

簡略化ｾｸﾞﾒﾝﾄ定義を使用すると、ｾｸﾞﾒﾝﾄの記述が簡単になるだけではなく、高級言語で使用されるｾｸﾞﾒﾝﾄ構造を容易に定義できます。この場合、必要なASSUME文やGROUP文は自動的に生成されます。最初に、.MODEL文でﾒﾓﾘ･ﾓﾃﾞﾙを宣言します。
      .MODEL
memory_model
memory_modelには、SMALL, TINY, MEDIUM, COMPACT, LARGE, HUGE, FLATのどれかを指定します。以後は、SEGMENTとENDS文を用いないで、次に示す簡略化ｾｸﾞﾒﾝﾄ定義を使用します。
.CODE
{name}
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ
.DATA
初期化ありﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.DATA?
初期化なしﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.STACK
{size} sizeﾊﾞｲﾄのｽﾀｯｸ･ｾｸﾞﾒﾝﾄ(size省略時は1024ﾊﾞｲﾄ)
.CONST
定数ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.FARDATA
{name} 初期化ありfarﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.FARDATA?
{name} 初期化なしfarﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
これらの記述で、指定する種類のｾｸﾞﾒﾝﾄの開始を意味します。開始されたｾｸﾞﾒﾝﾄは、新たなこれらの記述かEND文で自動的に終了とみなされますので、ENDS文は不要です。また、これらのｾｸﾞﾒﾝﾄは、先頭の.(ﾋﾟﾘｵﾄﾞ)を@(ｱｯﾄ･ﾏｰｸ)に置き換えた名前で参照できます。

 ﾌﾟﾛｸﾞﾗﾑの実行開始と終了のために、専用の文が利用できます。ﾌﾟﾛｸﾞﾗﾑの実行開始位置に.STARTUP文を記述することで、DSﾚｼﾞｽﾀとSS:SPの初期値設定用のｺｰﾄﾞが自動的に生成され、END文で指定する実行開始位置の指定が不要となります。
      .STARTUP
ﾌﾟﾛｸﾞﾗﾑの実行開始
同様に、.EXIT文を記述すれば、ﾌﾟﾛｸﾞﾗﾑの実行を終了するｺｰﾄﾞが生成されます。
      .EXIT
{exit_code}
exit_codeは終了ｺｰﾄﾞです。通常、これらの文で生成されるｺｰﾄﾞは表示されませんが、必要ならば起動時ｵﾌﾟｼｮﾝ指定などでﾘｽﾄに表示させることもできます。簡略化ｾｸﾞﾒﾝﾄで.STARTUP文を用いた場合、EXE形式ではｽﾀｯｸ･ｾｸﾞﾒﾝﾄの確保方法が多少異なります。ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄとの相対位置などが問題となる場合は、詳細ﾘｽﾄでｽﾀｯｸ･ｾｸﾞﾒﾝﾄの確保方法を確認して下さい。次に簡略化ｾｸﾞﾒﾝﾄの使用例を示します。
■ EXE形式の簡略化ｾｸﾞﾒﾝﾄの使用例
  .MODEL   SMALL
ｽﾓｰﾙ･ﾒﾓﾘ･ﾓﾃﾞﾙ
  .STACK
ｽﾀｯｸ･ｾｸﾞﾒﾝﾄの確保
  .CODE
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄの開始
  .STARTUP
ﾌﾟﾛｸﾞﾗﾑ実行開始処理
  …
(ﾌﾟﾛｸﾞﾗﾑの本体)
  .EXIT
ﾌﾟﾛｸﾞﾗﾑ実行終了
  END
ｿｰｽ･ﾌｧｲﾙ終了宣言
■ C0M形式の簡略化ｾｸﾞﾒﾝﾄの使用例
  .MODEL   TINY
ﾀｲﾆｨ･ﾒﾓﾘ･ﾓﾃﾞﾙ
  .CODE
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄの開始
  .STARTUP
ﾌﾟﾛｸﾞﾗﾑ実行開始処理 (必ずｺｰﾄﾞ･ｾｸﾞﾒﾝﾄの先頭に記述)
  …
(ﾌﾟﾛｸﾞﾗﾑの本体)
  .EXIT
ﾌﾟﾛｸﾞﾗﾑ実行終了
  END
ｿｰｽ･ﾌｧｲﾙ終了宣言


ｸﾞﾙｰﾌﾟ定義

1.6 ｸﾞﾙｰﾌﾟ定義

■ GROUP文

 複数のﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄをｸﾞﾙｰﾌﾟ化して、1つのｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ(ｾﾚｸﾀ)で参照できます。これには、次のGROUP文で宣言をします。
gname GROUP sname{,sname,…}
gnameはｸﾞﾙｰﾌﾟ名で、ｸﾞﾙｰﾌﾟの先頭ｱﾄﾞﾚｽを表わし、snameはｸﾞﾙｰﾌﾟに属するｾｸﾞﾒﾝﾄ名です。ｸﾞﾙｰﾌﾟに指定されたｾｸﾞﾒﾝﾄの実際の位置や結合順序は、この宣言だけでは決まらず、場合によっては、ｸﾞﾙｰﾌﾟに属さないｾｸﾞﾒﾝﾄが間に含まれる場合もあります。ｸﾞﾙｰﾌﾟに含まれるｾｸﾞﾒﾝﾄは、64Kﾊﾞｲﾄ以内の制限があります。ｸﾞﾙｰﾌﾟを参照する場合は、ｸﾞﾙｰﾌﾟの先頭ｱﾄﾞﾚｽを、ｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ(例えばDS)に設定して参照します。

 ｸﾞﾙｰﾌﾟの使用では、OFFSET演算子の使用に注意する必要があります。なお、ﾃﾞｰﾀ定義命令のｵﾍﾟﾗﾝﾄﾞに単に変数名を記述した場合も、OFFSETの指定となります。
■ | 簡略化ｾｸﾞﾒﾝﾄ定義の場合、OFFSET演算子の対象項目がnearﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄならば、ｸﾞﾙｰﾌﾟの先頭からのｵﾌｾｯﾄとなりますが、farﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄならば、対象項目が属するｾｸﾞﾒﾝﾄの先頭からのｵﾌｾｯﾄとなります。
■ | SEGMENTとENDSによる完全なｾｸﾞﾒﾝﾄ定義では、OFFSETの対象項目が属するｾｸﾞﾒﾝﾄの先頭からのｵﾌｾｯﾄとなります。
ただし、この内容は、ｾｸﾞﾒﾝﾄ変更演算子で用いられる:(ｺﾛﾝ)を利用して、例えばｸﾞﾙｰﾌﾟの先頭からのｵﾌｾｯﾄに変更できます。
例:
gname:expr
ｸﾞﾙｰﾌﾟgnameからのｵﾌｾｯﾄ
命令のｵﾍﾟﾗﾝﾄﾞにおけるﾒﾓﾘ参照では、ASSUME文でｸﾞﾙｰﾌﾟ名が指定されていればｸﾞﾙｰﾌﾟの先頭からのｵﾌｾｯﾄが、そうでなければｵﾍﾟﾗﾝﾄﾞの属するｾｸﾞﾒﾝﾄの先頭からのｵﾌｾｯﾄが使用されます。
例:
  MOV SI,OFFSET DGROUP:BUFFER


手続きの記述の概要

1.7 手続きの記述の概要

ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄに含まれる特定の一連の命令をまとめて手続き(ﾌﾟﾛｼｰｼﾞｬ : procedure)として定義し、他から必要に応じて呼び出す(call)ことができます。手続きは、次の形式で記述します。
label

PROC
{手続きの属性} 標準の実行開始位置
文
…
slabel
LABEL
PROC
別の実行開始位置
…
文
RET
属性に依存してRETFまたはRETNに変換
label
ENDP
PROC文とENDP文で、手続きに含まれる文を指定します。labelは手続きの名前で、次の形式で他からの呼び出し時に参照されます。
      CALL label
この場合、手続きの先頭から実行されますが、例えばLABEL文を使用すると、任意の位置に手続き実行開始位置を設定できます。RET命令の実行で、CALL命令を実行した呼び出し元へ制御を戻します。RET命令の位置はとくに制限はなく、PROC文とENDP文の間の必要な位置に記述します。

 手続きの属性には、この呼び出しでｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀの内容を変更するのか(far call)、または変更しないのか(near call)に応じて、FARまたはNEARなどを指定します。これは、呼び出し時のCALL命令と復帰時のRET命令の種類に影響します。PROC文の指定で、自動的に手続きの属性が仮定されます。なお、完全なｾｸﾞﾒﾝﾄ記述では、属性のﾃﾞﾌｫﾙﾄはNEARですが、簡略化ｾｸﾞﾒﾝﾄ記述ではﾒﾓﾘ･ﾓﾃﾞﾙの指定に依存します。
■ 手続きの使用例(EXE形式)
        .MODEL SMALL
;
        .DATA
ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ開始宣言
MSG     BYTE     "This is a sample program."
表示文字列定義
        BYTE     0DH,0AH
復帰改行
        BYTE     0
表示文字列の終了子
;
        .STACK
ｽﾀｯｸ･ｾｸﾞﾒﾝﾄ確保 (ﾃﾞﾌｫﾙﾄの1Kﾊﾞｲﾄ)
;
        .CODE
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ開始宣言
MSGOUT  PROC
手続きMSGOUT開始宣言
        MOV      DL,[SI]
1ﾊﾞｲﾄ･ﾃﾞｰﾀをDLにｺﾋﾟｰ
        OR       DL,DL
終了子か検査
        JZ       MSGOUT1
終了子ならば分岐後、呼び出し元へ復帰へ
        MOV      AH,02H
ｺﾝｿｰﾙ出力を指定
        INT      21H
DLの内容をｺﾝｿｰﾙに表示
        INC      SI
文字列ﾎﾟｲﾝﾀ(SI)を進行(+1)
        JMP      MSGOUT
終了子まで継続
MSGOUT1 RET
呼び出し元へ復帰
MSGOUT  ENDP
手続きMSGOUT終了宣言
;
        .STARTUP
実行開始初期設定
        MOV      SI,OFFSET MSG
表示文字列先頭ﾎﾟｲﾝﾀを設定
        CALL     MSGOUT
文字列表示 (手続きの呼び出し)
        .EXIT
ﾌﾟﾛｸﾞﾗﾑの実行終了
;
        END
ｿｰｽ･ﾌｧｲﾙ終了宣言
MS-DOSの場合で.STARTUP文と.EXIT文を用いなかったときは、次のようになります(変更部分のみ)。
START:  MOV      AX,@DATA
DATAのｾｸﾞﾒﾝﾄを取得
        MOV      DS,AX
DSにdataのｾｸﾞﾒﾝﾄを設定(DSの初期化)
        MOV      SI,OFFSET MSG
SIに文字列MSGのｵﾌｾｯﾄ･ｱﾄﾞﾚｽを設定
        CALL     MSGOUT
文字列表示の手続き呼び出し
        MOV      AL,0
終了ｺｰﾄﾞを0に設定
        MOV      AH,4CH
ﾌﾟﾛｸﾞﾗﾑ終了を指定
        INT      21H
ﾌﾟﾛｸﾞﾗﾑの実行を終了
;
        END      START
ｿｰｽ･ﾌｧｲﾙ終了宣言 (実行開始ｱﾄﾞﾚｽ指定)

手続きの属性を含むRET命令(RETFとRETN)を用いることで、手続きの記述を簡略化することもでき、PROC文とENDP文を省略できます。ただし、この場合は呼び出し側で手続きの属性を指定する必要があります。
例:
  CALL  FAR PTR label
far手続きの呼び出し(nearの場合はFARがNEARになります。)


分岐と局所ﾗﾍﾞﾙ

1.8 分岐と局所ﾗﾍﾞﾙ

分岐は、(CSと)IP(EIP)の内容を変更することで、いくつかの種類があります。無条件分岐の場合は、距離を指定するｷｰﾜｰﾄﾞ(SH0RT, NEAR, FARなど)を必要に応じて付加できます。これが指定されていない場合は、ｱｾﾝﾌﾞﾗが最も効率的なｺｰﾄﾞを生成します。

 ﾚｼﾞｽﾀ間接ｵﾍﾟﾗﾝﾄﾞが分岐命令で用いられている場合で、ｻｲｽﾞが確定できないときは、次のいずれかをｵﾍﾟﾗﾝﾄﾞに付加します。
WORD  PTR
NEAR16の場合
DWORD PTR
FAR16またはNEAR32の場合
FWORD PTR
FAR32の場合
これを省略した場合のｻｲｽﾞは、.MODEL文の指定またはｾｸﾞﾒﾝﾄ･ｻｲｽﾞから決められます。次の例を参考にしてください。
var    DWORD   label
FAR16の(label:からを示す)ｱﾄﾞﾚｽ
       …
far16p TYPEDEF PTR FAR16
TYPEDEFによるfar16p定義
       JMP     far16p PTR var
var参照によるlabel:へのfar間接分岐
       JMP     DWORD PTR var
同上
       JMP     var
同上
       JMP     FAR16 PTR var
varへのfar直接分岐(誤り)
label:

32ﾋﾞｯﾄ属性ｾｸﾞﾒﾝﾄにおいて、DWORDでのFAR16/NEAR32が区別できない場合は、TYPEDEF文で定義した形を用いて指定します。
far16p TYPEDEF PTR FAR16
TYPEDEFによるfar16p定義
       JMP     far16p [DI]
FAR16の間接分岐

条件付き分岐命令は、分岐先までの距離がSHORTで表現できない場合、自動的に逆の条件命令と無条件分岐命令とに展開されます。この展開では、ﾚﾍﾞﾙ3の警告が設定されます。この展開は0PTI0N NOLJMPで禁止できます。
    JZ label
→
    JNZ @1
    文
    JMP label
@1: 文

■ 局所ﾗﾍﾞﾙ

 分岐命令または条件付き分岐命令で局所的にだけ使用されるﾗﾍﾞﾙで、とくに明確な名前を使用する必要がないような場合、ｱｾﾝﾌﾞﾗに固有のﾗﾍﾞﾙ名を生成させることができます。このようなﾗﾍﾞﾙの定義には、@@を使用します。ｱｾﾝﾌﾞﾗは、これを@と数字から構成されるﾗﾍﾞﾙ(@0,@1,@2,...)に変換します。これを参照する分岐命令では、前方(forward)参照の場合は@Fを、後方(backward)参照の場合は@Bを指定します。この場合、@Fはこれ以降で最初に定義されている@@が、@Bはこれ以前で最後に定義されている@@が指定されたものとみなされます。
    …
@@: 文
①
    …
    JMP @F
②へ分岐
    …
    JMP @B
①へ分岐
    …
@@: 文
②
    …
    JMP @F
③へ分岐
    …
    JMP @B
②へ分岐
    …
@@: 文
③
    …
@@: JMP @B
自分自身への分岐(JMP $)
    …


ﾏｲｸﾛﾌﾟﾛｾｯｻの指定

1.9 ﾏｲｸﾛﾌﾟﾛｾｯｻの指定

ﾏｲｸﾛﾌﾟﾛｾｯｻ指定文を使用すれば、ｱｾﾝﾌﾞﾙする命令の範囲を限定できます。この文はｾｸﾞﾒﾝﾄの外部で記述する必要があります。また、.M0DEL文との相対的な記述位置で、指定内容が異なります。通常は、.MODEL文の直後に記述します。ﾏｲｸﾛﾌﾟﾛｾｯｻ指定文がない場合は.8086と.8087として処理されます。
指定文 意味
.8086
8086の命令と8087の命令
.186
80186の命令と8087の命令
.286
特権命令を含まない80286の命令と80287の命令 (.286Pより優先)
.286P
特権命令を含む80286の命令と80287の命令
.386
特権命令を含まない80386の命令と80387の命令 (.386Pより優先)
.386P
特権命令を含む80386の命令と80387の命令
.486
特権命令を含まない80486の命令と80387の命令 (.486Pより優先)
.486P
特権命令を含む80486の命令と80387の命令
.8087
8087の命令
.287
80287の命令
.387
80387の命令
.NO87
数値演算ﾌﾟﾛｾｯｻの命令を使用不可にする。


ﾃﾞｰﾀ形式

2. ﾃﾞｰﾀ形式

2.1 固定小数点と浮動小数点
2.2 整数
2.3 ﾎﾟｲﾝﾀ
2.4 BCD
2.5 ｼｮｰﾄ･ﾘｱﾙ
2.6 ﾛﾝｸﾞ･ﾘｱﾙ
2.7 ﾃﾝﾎﾟﾗﾘ･ﾘｱﾙ


固定小数点と浮動小数点

2.1 固定小数点と浮動小数点

数値表現には、固定小数点と浮動小数点の2種類があります。各々表現範囲や精度に特徴があります。どちらの場合も0での除算はｴﾗｰとなり例外が発生します。

 ■ 固定小数点 (fixed point)

 固定小数点は整数(integer)とも呼ばれ、整数値を表わすために使用され、次に示す種類があります。これらは、種類に応じて表現可能な範囲が決まっています。演算結果がこの範囲を越えた場合をｵｰﾊﾞｰﾌﾛｰ(overflow)と呼びます。
種類 長さ 命令 備考
ﾊﾞｲﾄ 1
BYTE
符号なし (0～255)
SBYTE
符号付き (-128～128)
ﾜｰﾄﾞ 2
WORD
符号なし (0～65,535)
SWORD
符号付き (-32,768～32,767)
ﾀﾞﾌﾞﾙﾜｰﾄﾞ 4
DWORD
符号なし (0～4,294,967,295)
SDWORD
符号付き (-2,147,483,648～2,147,483,647)
ﾌｧｰﾜｰﾄﾞ 6
FWORD
32ﾋﾞｯﾄのfarﾎﾟｲﾝﾀ用
ｸｧｯﾄﾞﾜｰﾄﾞ 8
QWORD
符号なしまたは符号付き
ﾃﾝﾊﾞｲﾄ 10
TBYTE
符号付きﾊﾟｯｸ形式BCD

■ 浮動小数点 (floating point)

 浮動小数点は実数(real)とも呼ばれ、非常に大きな数値から小さな数値まで表わすことができます。一般に浮動小数点では、次の形式が使用されます。
符号 × 仮数部 × 底指数部
仮数部は有効数字(桁数)に相当し、これに使用されるﾋﾞｯﾄ数が長ければ、高い精度で数値を表現できます。内部形式での底には、通常は2が使用されます。指数部は、数値のﾀﾞｲﾅﾐｯｸ･ﾚﾝｼﾞに対応します。演算結果が大きすぎて表現できない場合(指数部の上位への溢れ)をｵｰﾊﾞｰﾌﾛｰと呼びます。逆に、小さすぎて表現できない場合(指数部の下位への溢れ)をｱﾝﾀﾞｰﾌﾛｰと呼びます。これらは、値の符号とは関係ありません。

 通常扱う浮動小数点は、数値演算ﾌﾟﾛｾｯｻで処理される例が多く、そのIEEE形式浮動小数点では、精度によって、REAL4で定義される全体の長さが4ﾊﾞｲﾄの単精度(short_real : single precision)と、REAL8で定義される8ﾊﾞｲﾄの倍精度(long_real : double precision)があります。また、主に数値演算ﾌﾟﾛｾｯｻの内部で使用されるREAL10で定義されたﾃﾝﾎﾟﾗﾘ･ﾘｱﾙ(temporary_real)もあります。
種類 | 長さ | 精度と表現範囲の近似値
ｼｮｰﾄ･ﾘｱﾙ | 4 | 24ﾋﾞｯﾄ(10進数約7.2桁) 1.18×10-38≦|x|≦3.40×1038
ﾛﾝｸﾞ･ﾘｱﾙ | 8 | 53ﾋﾞｯﾄ(10進数約15.9桁) 2.23×10-308≦|x|≦1.80×10308
ﾃﾝﾎﾟﾗﾘ･ﾘｱﾙ | 10 | 64ﾋﾞｯﾄ(10進数約19.2桁) 2.23×10-4932≦|x|≦1.80×104932


整数

2.2 整数

整数の表現には2進数が使用されます。符号付き2進数では2の補数表現となり、最上位のﾋﾞｯﾄで符号(sign)が判断できます。

 整数の定義では、BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD, QWORDを使用します。FWORDは、80386/80486のﾎﾟｲﾝﾀ用ですが、整数の定義にも使用できます。符号付きを表すSBYTE, SWORD, SDWORDは、上位への符号拡張や、ｼﾝﾎﾞﾘｯｸ･ﾃﾞﾊﾞｯｶﾞCV(CodeView)への正確な型情報の指定が特に必要な場合に使用し、それ以外ではBYTE, WORD, DWORDが使用できます。ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
0C
  BYTE   +12
符号なしﾊﾞｲﾄ
F4
  SBYTE  -12
符号付きﾊﾞｲﾄ
000C
  WORD   +12
符号なしﾜｰﾄﾞ(2ﾊﾞｲﾄ)
FFF4
  SWORD  -12
符号付きﾜｰﾄﾞ(2ﾊﾞｲﾄ)
0000000C
  DWORD  +12
符号なしﾀﾞﾌﾞﾙﾜｰﾄﾞ(4ﾊﾞｲﾄ)
FFFFFFF4
  SDWORD -12
符号付きﾀﾞﾌﾞﾙﾜｰﾄﾞ(4ﾊﾞｲﾄ)
00000000000C
  FWORD  +12
符号なしﾌｧｰﾜｰﾄﾞ(6ﾊﾞｲﾄ)
FFFFFFFFFFF4
  FWORD  -12
符号付きﾌｧｰﾜｰﾄﾞ(6ﾊﾞｲﾄ)
000000000000000C
  QWORD  +12
符号なしｸｧｯﾄﾞﾜｰﾄﾞ(8ﾊﾞｲﾄ)
FFFFFFFFFFFFFFF4
  QWORD  -12
符号付きｸｧｯﾄﾞﾜｰﾄﾞ(8ﾊﾞｲﾄ)


ﾎﾟｲﾝﾀ

2.3 ﾎﾟｲﾝﾀ

■ NEAR,FAR

 ﾒﾓﾘ･ｱﾄﾞﾚｽを定義する変数をとくにﾎﾟｲﾝﾀ(pointer)と呼びます。ﾎﾟｲﾝﾀには、ｵﾌｾｯﾄのみの場合のnearとｾｸﾞﾒﾝﾄ:ｵﾌｾｯﾄの場合のfarがあり、ｵﾌｾｯﾄには16ﾋﾞｯﾄと32ﾋﾞｯﾄの場合がありますので、near16, near32, far16, far32の合計4種類存在します。
種類 | 16ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄ | 32ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄ
near | WORD | DWORD
far | DWORD | FWORD
定義するｾｸﾞﾒﾝﾄのｱﾄﾞﾚｽ･ｻｲｽﾞが標準の16ﾋﾞｯﾄの場合、nearﾎﾟｲﾝﾀでの定義は、16ﾋﾞｯﾄの符号なし整数の定義と同様です。farﾎﾟｲﾝﾀでは、下位側からｵﾌｾｯﾄ、ｾｸﾞﾒﾝﾄとなります。32ﾋﾞｯﾄの場合、nearﾎﾟｲﾝﾀでの定義は、32ﾋﾞｯﾄの符号なし整数の定義と同様です。farﾎﾟｲﾝﾀでは、16ﾋﾞｯﾄ同様にｵﾌｾｯﾄ、ｾｸﾞﾒﾝﾄの順になります。各々、結果的にnearﾎﾟｲﾝﾀの内容は、farﾎﾟｲﾝﾀのｵﾌｾｯﾄ部分と同じになります。WORDとSEG演算子を用いて、ｾｸﾞﾒﾝﾄ部分だけの単独定義もできます。同様にfar属性内でもOFFSET演算子を用いて、ｵﾌｾｯﾄ部分の単独定義もできます。
 ■
farﾎﾟｲﾝﾀのﾒﾓﾘ上での構成
16ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄ |  |  | ｾｸﾞﾒﾝﾄ |  | ｵﾌｾｯﾄ
32ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄ | ｾｸﾞﾒﾝﾄ |  | ｵﾌｾｯﾄ
ｱﾄﾞﾚｽ | +5 | +4 | +3 | +2 | +1 | 0
注意: NEARではｾｸﾞﾒﾝﾄが存在せず、ｵﾌｾｯﾄのみとなります。

■ ﾛｹｰｼｮﾝ･ｶｳﾝﾀ ($)

 ﾎﾟｲﾝﾀに関連するものとして、現在のｱｾﾝﾌﾞﾙ･ｱﾄﾞﾚｽを表わすﾛｹｰｼｮﾝ･ｶｳﾝﾀがあります。これは$(ﾄﾞﾙ記号)で表わされ、nearまたはfarの属性をもつｵﾌｾｯﾄを表わす定数として参照できます。
例:
label EQU $
現在のｱﾄﾞﾚｽをlabelで定義


BCD

2.4 BCD

BCD (binary coded decimal : 2進化10進数) は、2進数を用いて10進数を表現するために使用されます。これには、次の2種類があります。
◆ | ﾊﾟｯｸ形式BCD (4ﾋﾞｯﾄで10進数1桁を表わす)
◆ | ｱﾝﾊﾟｯｸ形式BCD (8ﾋﾞｯﾄで10進数1桁を表わす)

■ ﾊﾟｯｸ形式BCD

 ﾊﾟｯｸ形式BCDは、4ﾋﾞｯﾄで表現される16進数の内、0から9までの値を使用します。通常、多数桁定義の場合の最上位ﾊﾞｲﾄは、符号を表わすために使用され、00Hが正を、80Hが負を表します。従って、TBYTEを使用したﾊﾟｯｸ形式BCDの表現範囲は10進数で18桁、-999999999999999999～999999999999999999となります。
■ TBYTEによるﾊﾟｯｸ形式BCDのﾒﾓﾘ上の構成
(値:123456789012345678)
 | S | 12 | 34 | 56 | 78 | 90 | 12 | 34 | 56 | 78
ｱﾄﾞﾚｽ | +9 | +8 | +7 | +6 | +5 | +4 | +3 | +2 | +1 | 0
S:符号
次にTBYTEによるﾊﾟｯｸ形式BCD定義の例を示しますが、ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
00000000000000000012
  TBYTE 12H
80000000000000000012
  TBYTE 80000000000000000012H
00000000000000122356
  TBYTE 122356H
80000000000000123456
  TBYTE 80000000000000123456H

■ ｱﾝﾊﾟｯｸ形式BCD

 ｱﾝﾊﾟｯｸ形式BCDの場合、1ﾊﾞｲﾄの下位4ﾋﾞｯﾄで10進数の1桁を表わします。上位4ﾋﾞｯﾄの値は、通常0が使用されます。上位4ﾋﾞｯﾄに3を設定すると、数字を表わす文字ｺｰﾄﾞに相当し、都合が良い場合もありますが、通常の演算処理時にﾊﾞｲﾄﾃﾞｰﾀそのままで演算ができなくなります。ｱﾝﾊﾟｯｸ形式BCDの定義にはBYTEを使用しますが、とくにﾒﾓﾘでの配置順序やｻｲｽﾞに制約はありません。
■ ｱﾝﾊﾟｯｸ形式 BCD1桁(1ﾊﾞｲﾄ)の構成
ﾋﾞｯﾄ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
 | 通常0 |  |  |  | BCD値1桁


ｼｮｰﾄ･ﾘｱﾙ

2.5 ｼｮｰﾄ･ﾘｱﾙ

次にｼｮｰﾄ･ﾘｱﾙの内部形式を示します。
31
30 23
22 0
S 指数部 仮数部
S:符号 (0=正、1=負)
23ﾋﾞｯﾄの仮数部では、常に1になる最上位のﾋﾞｯﾄは省略されています。従って、仮数部の表現範囲は次のようになります。
1≦暗黙の1を含めた仮数≦2－2-23
8ﾋﾞｯﾄの指数部(符号無し整数)は、値0.0を表わすために0が、特殊数(special number)を表わすのに255(0FFH)が用いられています。実際に指数として使用されるのは、1～254の範囲となります。また、指数部の値から127(7FH)を引いた値が実際の指数になります。ｼｮｰﾄ･ﾘｱﾙで用いられる特殊数には、以下の形式があります。
 7F800000H =
+∞ (正の無限大)
0FF800000H =
-∞ (負の無限大)
0FFC00000H =
不定
次に、浮動小数点数値の定義例を示しますが、ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
41400000
  REAL4 +12.0
C1400000
  REAL4 -12.0
41458794
  REAL4 +12.3456
C1458794
  REAL4 -12.3456


ﾛﾝｸﾞ･ﾘｱﾙ

2.6 ﾛﾝｸﾞ･ﾘｱﾙ

次にﾛﾝｸﾞ･ﾘｱﾙの内部形式を示します。
63
62 52
51 0
S 指数部 仮数部
S:符号 (0=正、1=負)
数点位置 52ﾋﾞｯﾄの仮数部では、常に1になる最上位のﾋﾞｯﾄは省略されています。従って、仮数部の表現範囲は次のようになります。
1≦暗黙の1を含めた仮数≦2－2-52
11ﾋﾞｯﾄの指数部(符号無し整数)は、値0.0を表わすために0が、特殊数を表わすのに2047(7FFH)が用いられています。実際に指数として使用されるのは、1～2046の範囲が使用されます。また、指数部の値から1023(3FFH)を引いた値が実際の指数になります。ﾛﾝｸﾞ･ﾘｱﾙで用いられる特殊数には、以下の形式があります。
 7FF0000000000000H =
+∞
0FFF0000000000000H =
-∞
0FFF8000000000000H =
不定
次に、浮動小数点数値の定義例を示しますが、ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
4028000000000000

  REAL8 +12.0
C028000000000000

  REAL8 -12.0
4028B0F27BB2FEC5

  REAL8 +12.3456
C028B0F27BB2FEC5

  REAL8 -12.3456


ﾃﾝﾎﾟﾗﾘ･ﾘｱﾙ

2.7 ﾃﾝﾎﾟﾗﾘ･ﾘｱﾙ

次にﾃﾝﾎﾟﾗﾘ･ﾘｱﾙの形式を示します。
79
78 64
63 0
S 指数部 仮数部
S:符号 (0=正、1=負)
この形式では、一般に1となる仮数部の最上位のﾋﾞｯﾄも含まれています。値が0.0以外では、仮数部の最上位のﾋﾞｯﾄが1になるように調整されます。この状態の値を、正規化数(normal)と呼びます。仮数部の最上位が1ではなく、精度が一部失われているような状態をｱﾝﾉｰﾏﾙ(unnormal)またはﾃﾞﾉｰﾏﾙ(denormal)と呼びます。
15ﾋﾞｯﾄの指数部(符号無し整数)は、値0.0を表わすために0が、特殊数を表わすのに32767(7FFFH)が用いられています。実際に指数として使用されるのは、1～32766の範囲が使用されます。また、指数部の値から16383(3FFFH)を引いた値が実際の指数になります。ﾃﾝﾎﾟﾗﾘ･ﾘｱﾙで用いられる特殊数には、以下の形式があります。
 7FFF8000000000000O00H =
+∞
0FFFF8000000000000000H =
-∞
0FFFFC000000000000000H =
不定
次に、浮動小数点数値の定義例を示しますが、ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
4002C000000000000000
  REAL10 +12.0
C002C000000000000000
  REAL10 -12.0
4002C58793DD97F62B6B
  REAL10 +12.3456
C002C58793DD97F62B6B
  REAL10 -12.3456


ﾃﾞｰﾀの定義と領域確保

3. ﾃﾞｰﾀの定義と領域確保

ﾃﾞｰﾀ領域を確保(定義)するには、そのｻｲｽﾞに応じたﾃﾞｰﾀ定義命令を使用します。ｵﾍﾟﾗﾝﾄﾞに記述できるものは、整数値、文字列(string)、実数値、ｱﾄﾞﾚｽ、未初期化(値が不定)を表わす記号?のいずれかです。
 ■
ﾃﾞｰﾀ定義命令
命令 ｻｲｽﾞ 主なｵﾍﾟﾗﾝﾄﾞ ｱﾄﾞﾚｽ指定
BYTE
1 整数値 不可
SBYTE
WORD
2 整数値
ｱﾄﾞﾚｽ 		offset16
segment
SWORD
DWORD
4 整数値
ｱﾄﾞﾚｽ 		segment:offset16
offset32【80386】
SDWORD
FWORD
6 ｱﾄﾞﾚｽ segment:offset32
QWORD
8 整数値 不可
TBYTE
10 ﾊﾟｯｸ形式BCD 不可
REAL4
4 実数値 不可
REAL8
8 実数値 不可
REAL10
10 実数値 不可

■ TYPEDEF文

 TYPEDEF文を用いると、新しい型(type)や既存の型の同義語を定義できます。これは、ﾎﾟｲﾝﾀ型の定義や、CodeViewへの正確な型情報の指定に有効です。
newtype
 TYPEDEF
{distance}
 {PTR}
type
newtypeは新しく定義する型を表わす名前です。distance(距離)は、ﾃﾞﾌｫﾙﾄのｾｸﾞﾒﾝﾄ･ｻｲｽﾞを表わすNEAR, FARまたはNEAR16, FAR16, NEAR32, FAR32のいずれかを必要に応じて指定します。PTRはﾎﾟｲﾝﾀ型の指定で、ﾒﾓﾘ･ﾓﾃﾞﾙまたはｾｸﾞﾒﾝﾄのｻｲｽﾞからﾃﾞﾌｫﾙﾄが決まります。typeは定義済みの型です。

3.1 整数値
3.2 実数値
3.3 文字列
3.4 ｱﾄﾞﾚｽ(ｾｸﾞﾒﾝﾄとｵﾌｾｯﾄ)
3.5 未初期化
3.6 複数領域の確保
3.7 構造体と共用体
3.8 ﾚｺｰﾄﾞ
3.9 ｱﾄﾞﾚｽとﾗﾍﾞﾙ関係の操作


整数値

3.1 整数値

整数値は、次の形式で記述します。
{-}数字列{基数指定子}
数字列に含まれる数字は、指定されている基数(radix)で許される数字でなければなりません。また、負符号-が存在すると、数字列を変換後、2の補数を結果とします。通常の数値をｵﾍﾟﾗﾝﾄﾞに記述した場合、通常は10進整数と解釈され、2進数に変換されます。整数値は通常ﾃﾞﾌｫﾙﾄとして、基数が10の整数、即ち10進数として解釈されます。しかし、次に示す基数指定子を数字列の最後に付加することで変更できます。ただし、数字列の最初は、識別子との区別から、数字で始まる必要があります。10を越える基数で、数字以外で始まる場合は、数字列の先頭に0を付加します。

 ■ 基数指定子

 基数指定子を数字列の最後に付加することで、その行に限って基数を変更できます。次表に基数指定子の種類を示します。
 ■
基数指定子
指定子 | 基数 | 使用文字 | 備考
YまたはB | 2(Binary) | 0 1 | Bはﾃﾞﾌｫﾙﾄの基数が10以下の場合のみ可
QまたはO | 8(Octal) | 0 1 2 3 4 5 6 7
TまたはD | 10(Decimal) | 0 1 2 3 4 5 6 7 8 9 | Dはﾃﾞﾌｫﾙﾄの基数が12以下の場合のみ可
H | 16(Hexa-decimal) | 0 1 2 3 4 5 6 7 8 9 A B C D E F
次に、基数指定子の使用例を示しますが、ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
0065
  WORD 101
0005
  WORD 101B
0041
  WORD 101Q
0065
  WORD 101D
0101
  WORD 101H

■ .RADIX命令

 .RADIX命令を使用すれば、ﾃﾞﾌｫﾙﾄの基数を2～16の任意の値に変更できます。
      .RADIX d
dは2～16の範囲の値で、常に10進数です。ただし、この指定よりも文中で行う基数指定子での基数指定が優先します。次に.RADIX命令の使用例を示します。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
  .RADIX 2
ﾃﾞﾌｫﾙﾄを2進数に指定
0005
  WORD   101
  .RADIX 3
ﾃﾞﾌｫﾙﾄを3進数に指定
000A
  WORD   101
  .RADIX 4
ﾃﾞﾌｫﾙﾄを4進数に指定
0011
  WORD   101
  .RADIX 5
ﾃﾞﾌｫﾙﾄを5進数に指定
001A
  WORD 101
  .RADIX 15
ﾃﾞﾌｫﾙﾄを15進数に指定
00E2
  WORD   101
  .RADIX 16
ﾃﾞﾌｫﾙﾄを16進数に指定
0101
  WORD   101
0005
  WORD   101Y
16進ﾃﾞﾌｫﾙﾄを2進に一時変更
0041
  WORD   101Q
16進ﾃﾞﾌｫﾙﾄを8進に一時変更
0065
  WORD   101T
16進ﾃﾞﾌｫﾙﾄを10進に一時変更
0101
  WORD   101H
16進ﾃﾞﾌｫﾙﾄを16進に一時変更


実数値

3.2 実数値

実数値は、次の形式で記述します。
{+/-}整数部.小数部{E{+/-}指数部}
通常、数値は10進数で表わします。記述では、整数値との区別がつくことが最低条件です。例えば、小数点またはEで始まる指数部が存在すれば、実数値とみなされます。10進数の実数値は、2進数の内部形式に変換されます。実数値の指定では、この変換後の内部形式を、16進数を表わす数字列の最後にRを付加することで、直接指定することもできます。
16進数字列R
実数値の指定は、REAL4, REAL8, REAL10で使用できます。次に、実数値の定義例を示しますが、ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
41500000
  REAL4  13.0
12345678
  REAL4  12345678R
常に8桁
402A000000000000
  REAL8  13.0
123456789ABCDEF0
  REAL8  123456789ABCDEF0R
常に16桁
4002D000000000000000
  REAL10 13.0
123456789ABCDEF01234
  REAL10 123456789ABCDEF01234R
常に20桁


文字列

3.3 文字列

文字列は、'(一重引用符)または"(二重引用符)で囲みます。
'string'
'を含む場合は''を指定
"string"
"を含む場合は""を指定
一重引用符で囲まれた文字列に一重引用符が含まれる場合や、二重引用符で囲まれた文字列に二重引用符が含まれる場合は、それぞれ連続した2個の引用符で1個の引用符を表わします。

 文字列として、表示されない文字ｺｰﾄﾞを指定する場合は、整数値を用いて記述します。通常、文字列の定義には主としてBYTEが使用され、文字列に含まれる文字に対応するｺｰﾄﾞが順に格納されます。BYTE以外を使用する場合は、文字列の長さと格納順序に制約があるので注意が必要です。次に文字列の定義例を示しますが、ｱｾﾝﾌﾞﾙ･ﾘｽﾄでの1行中は、右側が下位ｱﾄﾞﾚｽとなります。
ｱｾﾝﾌﾞﾙ･ﾘｽﾄ ｿｰｽ･ﾌｧｲﾙ
41
  BYTE 'A'
41 42
  BYTE 'A','B'
41 42
  BYTE 'AB'
41 42 43
  BYTE 'ABC'
41 42 43 44
  BYTE 'ABCD'
長さは1行以内で任意
00 41
  WORD 'A'
41 42
  WORD 'AB'


ｱﾄﾞﾚｽ(ｾｸﾞﾒﾝﾄとｵﾌｾｯﾄ)

3.4 ｱﾄﾞﾚｽ (ｾｸﾞﾒﾝﾄとｵﾌｾｯﾄ)

ｱﾄﾞﾚｽを表わす記号を記述すれば、ｵﾌｾｯﾄ(またはｾｸﾞﾒﾝﾄとｵﾌｾｯﾄ)の値が定義できます。

 ■ ｵﾌｾｯﾄ

 ｵﾌｾｯﾄであることを明確にするためには、OFFSET演算子を使用します。ｾｸﾞﾒﾝﾄのｸﾞﾙｰﾌﾟ定義に属する場合は、ｵﾌｾｯﾄがｸﾞﾙｰﾌﾟ相対かｾｸﾞﾒﾝﾄ相対かの区別に注意する必要があります。
0FFSET
expr
例:
  MOV SI,0FFSET DGR0UP:BUFFER
ｾｸﾞﾒﾝﾄDGR0UPからのBUFFERのｵﾌｾｯﾄ値をSIに取得

■ ｾｸﾞﾒﾝﾄ

 ｾｸﾞﾒﾝﾄ名の場合はｾｸﾞﾒﾝﾄの値を定義できますが、ｱﾄﾞﾚｽのｾｸﾞﾒﾝﾄの値だけが必要な場合は、SEG演算子を用います。
SEG
expr
例:
  MOV AX,SEG BUFFER
BUFFERの属するｾｸﾞﾒﾝﾄ値をAXに取得
  MOV ES,AX
BUFFERの属するｾｸﾞﾒﾝﾄ値をESに設定(ｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀにｲﾐﾃﾞｨｴｲﾄ値を直接設定できないため)

■ ﾛｹｰｼｮﾝ･ｶｳﾝﾀ $

 また、現在のｱｾﾝﾌﾞﾙ･ｱﾄﾞﾚｽとなるﾛｹｰｼｮﾝ･ｶｳﾝﾀを表わす特殊な記号として$があります。使用例を次に示します。
例:
ADRS EQU   $-2
ADRSの値を定義
LAST DWORD $
LASTのｱﾄﾞﾚｽをfarﾎﾟｲﾝﾀとして定義(設定)


未初期化

3.5 未初期化

単に指定のｻｲｽﾞの領域を確保する場合は、?(疑問符)を記述します。通常、DUP演算子を伴わなければ、0のﾋﾞｯﾄで初期化されます。?を定数指定に使用した場合、単にﾛｹｰｼｮﾝ･ｶｳﾝﾀの調整が行なわれるだけで、定数の内容は未定義です。このことは、結合型がCOMMONのｾｸﾞﾒﾝﾄを使用する場合には注意する必要があります。定義の形式が異なるｾｸﾞﾒﾝﾄをﾘﾝｸ(link)すると、結合順序によっては結果が異なる場合が生じます。次に未初期化の使用例を示します。
例:
COUNT  BYTE ?
1ﾊﾞｲﾄの未初期化領域
BUFFER BYTE 20 DUP(?)
20ﾊﾞｲﾄの連続未初期化領域


複数領域の確保

3.6 複数領域の確保

同じｻｲｽﾞの要素からなる連続した領域の確保には、次の2つの方法があります。

 ■ ｶﾝﾏ分離

 ｵﾍﾟﾗﾝﾄﾞを,(ｶﾝﾏ)で区切ることで、複数の異なる値の要素を連続して定義できます。この場合のｵﾍﾟﾗﾝﾄﾞは、すべて同一の形式である必要はなく、ﾃﾞｰﾀ定義命令で許される任意の形式を使用できます。
例:
  BYTE 'A',00001101B,0AH,0

■ DUP演算子

 DUP演算子をｵﾍﾟﾗﾝﾄﾞに用いることで、領域確保の繰り返しを指定できます。
n
 DUP (const1{,const2,…})
括弧の内容がn回繰り返されます。括弧の中で、更にDUP演算子を使用して、ﾈｽﾄ (nest:入れ子) にすることも可能です。次にDUP演算子の使用例を示します。
例:
BUFFER WORD 2 DUP (3 DUP (12,100))
合計12ﾜｰﾄﾞ
上記の例の場合、内側のDUPで12, 100のﾍﾟｱ(2ﾜｰﾄﾞ)が3回繰り返され6ﾜｰﾄﾞ、それを更に2回繰り返すので合計12ﾜｰﾄﾞとなります。ﾒﾓﾘ上では下位側から0CH, 00H, 64H, 00Hが6連続となります。


構造体と共用体

3.7 構造体と共用体

構造体(structure)を用いれば、ﾃﾞｰﾀ形式の集合を効率的に使用できます。また、共用体(union)では、すべての要素を同一のｱﾄﾞﾚｽから割り当てられます。更に、この両者はﾈｽﾄすることも可能です。使用する場合は、宣言･定義･参照の3つの手順が必要です。

 ① 宜言

 宣言では、ﾃﾞｰﾀ領域は確保されず、構造と必要ならば初期値を指定するだけです。これは、次の形式で記述します。宣言はSTRUCT文またはUNION文で始まり、ENDS文で終わります。この間には、ﾌｨｰﾙﾄﾞ定義のﾃﾞｰﾀ宣言以外に、ｺﾒﾝﾄと条件付きｱｾﾝﾌﾞﾙ命令だけが記述できます。
■ 構造体宣言の形式
sname STRUCT {align}{,NONUNIQUE}
ﾌｨｰﾙﾄﾞ定義
sname ENDS
■ 共用体宣言の形式
uname UNI0N {align}{,NONUNIQUE}
ﾌｨｰﾙﾄﾞ定義
uname ENDS
snameは構造体の、unameは共用体の宣言名です。ﾌｨｰﾙﾄﾞ定義内でﾈｰﾑ欄に記述されたｼﾝﾎﾞﾙ(変数)はﾌｨｰﾙﾄﾞ名と呼ばれます。

 ﾌｨｰﾙﾄﾞ定義では、ﾃﾞｰﾀの型宣言を使用して、初期値を表わす定数またはﾃﾞｰﾀ領域を宣言できます。このとき、DUP演算子やｶﾝﾏを用いた複数要素の宣言以外では、構造体定義時に初期値を変更できます。文字列を用いた初期値は定義時に変更できますが、ｻｲｽﾞは変更できません。また、変更で指定した文字列が短い場合は、後にｽﾍﾟｰｽ(20H)が補われます。共用体では最初のﾌｨｰﾙﾄﾞだけ、初期値を指定できます。

 alignには、宣言でのﾌｨｰﾙﾄﾞ割り当て時のｱﾄﾞﾚｽ整列(1, 2, 4)を指定します。調整後の穴埋めには値0が用いられます。

 ﾌｨｰﾙﾄﾞの参照では、宣言名または定義時の名前を伴う必要があります。OPTI0N OLDSTRUCTSを指定すると、この必要は無くなります。ただし、宣言でNONUNIQUEを指定すると、常に必要となります。次に構造体宣言の例を示します。
例:
PASS_DATA STRUCT
DPTR      WORD   ?
DATA1     WORD   1
DATA2     WORD   2
DNAME     BYTE   "sample"
PASS_DATA ENDS

② 定義

 次の形式で定義することにより、記述位置に領域が確保されます。dnameは前記の宣言名(snameまたはuname)です。
{name} dname <{list}>
{name} dname {{list}}{,{{list}},…}
{name} dname n DUP({{list}})
n回の繰り返しを定義
nameは、この定義で確保される領域の先頭ｱﾄﾞﾚｽを表わす定義名(変数名)です。listは各ﾌｨｰﾙﾄﾞの初期値で、複数の場合はｶﾝﾏで区切って指定します。共用体では最初のﾌｨｰﾙﾄﾞだけ初期値を指定できます。初期値を省略したときは、宣言時の初期値が採用されます。まったく初期値を変更しない場合でも、括弧(<>または{ })は必要です。次に定義例を示します。
例:
PASS1 PASS_DATA <PASS2, ,4,"abc">
      PASS_DATA < >

③ 参照

 参照では、次の形式をｵﾍﾟﾗﾝﾄﾞで使用します。
dname.field_name
name.field_name
即ち、宣言名または定義名とﾌｨｰﾙﾄﾞ名とを.(ﾋﾟﾘｵﾄﾞ)で区切って指定します。構造体と共用体がﾈｽﾄしている場合は、これらを順次、ﾋﾟﾘｵﾄﾞで区切って記述します。次に参照の例を示します。
例:
  MOV PASS1.DPTR,DI
結果的に宣言例のDPTRにDIの内容を設定


ﾚｺｰﾄﾞ

3.8 ﾚｺｰﾄﾞ

ﾚｺｰﾄﾞ(record)を用いると、ﾊﾞｲﾄ、ﾜｰﾄﾞ、またはﾀﾞﾌﾞﾙﾜｰﾄﾞを、複数のﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞに分割して使用できます。使用する場合は、宣言･定義･参照の3つの手順が必要です。

 ① 宣言

 宣言では、ﾃﾞｰﾀ領域は確保されず、単にﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの分割と必要ならば初期値を宣言するだけです。これは、次の形式で宣言します。
rname RECORD field{,field,…}
rnameはﾚｺｰﾄﾞの名前です。fieldはﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの宣言で、次の形式を使用し、複数の場合はｶﾝﾏで区切ります。
bfname:width{=expr}
bfnameはﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの名前です。これは、ﾚｺｰﾄﾞ中のﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの最下位のﾋﾞｯﾄ位置を値としてもち、ｵﾍﾟﾗﾝﾄﾞで参照できます。widthはﾌｨｰﾙﾄﾞのﾋﾞｯﾄ長(幅)、exprは初期値を表わす式です。初期値を指定しない場合は、値として0が仮定されます。次にﾚｺｰﾄﾞ宣言の例を示します。
例:
IOCTL RECORD ST:2=0,IOMASK:4=15,EFLAG:3
1つのﾚｺｰﾄﾞ宣言で使用されるwidthの総和によって、1ﾊﾞｲﾄ、2ﾊﾞｲﾄあるいは4ﾊﾞｲﾄの最も小さいｻｲｽﾞの領域が仮定されます。例えば、8ﾋﾞｯﾄ以下では1ﾊﾞｲﾄになります。この領域に下位に詰めて、ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞが宣言された順に上位から割り当てられます。最上位に残りのﾋﾞｯﾄがあれば0になります。次に上記の例の場合のﾋﾞｯﾄ列を示します。
 ■
ﾚｺｰﾄﾞ宣言によるﾋﾞｯﾄ列の例
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0
余りﾋﾞｯﾄ |  |  |  |  |  |  | ST |  | IOMASK |  |  |  | EFLAG

② 定義

 次の形式でﾚｺｰﾄﾞを定義することにより、領域が確保されます。
{name} rname <{list}>
{name} rname {{list}}
{name} rname n DUP ({{list}})
n回の繰り返しを定義
nameは、この定義で確保される領域の先頭ｱﾄﾞﾚｽを表わします。rnameは、この定義以前に宣言されているﾚｺｰﾄﾞの名前です。listは初期値ﾘｽﾄで、ﾚｺｰﾄﾞの各ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの初期値をｶﾝﾏで区切ったものです。省略時は、宣言での初期値が採用されます。まったく初期値を変更しない場合でも、括弧(<>または{ })は必要です。
例:
DEVICE IOCTL <,,2>
実行命令のｿｰｽ･ｵﾍﾟﾗﾝﾄﾞの定数(ｲﾐﾃﾞｨｴｲﾄ)として、次の形式を使用できます。
rname <{list}>
次に使用例を示します。
例:
  MOV AX,IOCTL < >
IOCTLの宣言内容をAXに設定

③ 参照

 ﾚｺｰﾄﾞの名前nameは、定義で確保されたｻｲｽﾞの属性(BYTE, WORD, またはDWORD)をもち、ｵﾍﾟﾗﾝﾄﾞで参照できます。この場合、ﾚｺｰﾄﾞに含まれるﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞ全体をまとめて取り扱えます。ﾚｺｰﾄﾞに含まれるﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞを個別に取り扱うためには、ﾚｺｰﾄﾞ専用のMASK演算子とWIDTH演算子を使用します。MASK演算子のｵﾍﾟﾗﾝﾄﾞでの指定形式を次に示します。
MASK rname | 対象はﾚｺ-ﾄﾞ全体
MASK field | 対象はﾋﾞｯﾄ･ﾌｨ-ﾙﾄﾞ
これは、対象に含まれるﾋﾞｯﾄ位置のみ1の定数を意味します。従って、例えば対象がﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの場合、上記の形式を用いれば、ﾚｺｰﾄﾞ中の指定ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞだけのｾｯﾄ、ﾘｾｯﾄ、反転、更にﾚｺｰﾄﾞから特定のﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの取得が行えます。次に取得例を示します。
例:
  MOV AX,DEVICE
ﾚｺ-ﾄﾞ全体をAXに取得
  AND AX,MASK IOMASK
IOMASKのﾋﾞｯﾄﾃﾞｰﾀ以外を0に設定
MASK演算子を用いてﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞをﾚｺｰﾄﾞから取り出した場合、最後に宣言されているﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞを除き、そのままでは値として取り扱うには不便です。通常、これを適当なﾋﾞｯﾄ数だけ右(下位)へｼﾌﾄし、ﾚｼﾞｽﾀの最下位に移動して用います。このｼﾌﾄに必要なﾋﾞｯﾄ数は、ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの名前fieldで参照できます。具体的には、ﾚｺｰﾄﾞを適当なﾚｼﾞｽﾀ(AL，AX，またはEAX)に取得し、MASK演算子を使用したAND命令で必要なﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞだけを残し、CLﾚｼﾞｽﾀにfield(最下位のﾋﾞｯﾄ位置を表わす値)を設定し、CLﾚｼﾞｽﾀを用いてSHR命令でｼﾌﾄすれば、ﾚｼﾞｽﾀの最下位に移動し、ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの数値として扱えます。
例:
  MOV AX,DEVICE
ﾚｺ-ﾄﾞ全体をAXに取得
  AND AX,MASK IOMASK
IOMASKのﾋﾞｯﾄﾃﾞｰﾀ以外を0に設定
  MOV CL,IOMASK
移動ﾋﾞｯﾄ数設定(ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞの基準ﾋﾞｯﾄ位置)
  SHR AX,CL
IOMASKのﾋﾞｯﾄﾃﾞｰﾀはAXの最下位からに移動
ﾚｺｰﾄﾞまたは各ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞのﾋﾞｯﾄ長(幅)が必要な場合は、次の形式をｵぺﾗﾝﾄﾞで使用します。
WIDTH rname
対象はﾚｺ-ﾄﾞ
WIDTH field
対象はﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞ


ｱﾄﾞﾚｽとﾗﾍﾞﾙ関係の操作

3.9 ｱﾄﾞﾚｽとﾗﾍﾞﾙ関係の操作

■ LABEL文

 ﾃﾞｰﾀ定義命令のﾈｰﾑ部にﾗﾍﾞﾙを記述すると、属性と共に定義されるﾃﾞｰﾀの先頭ｱﾄﾞﾚｽがﾗﾍﾞﾙに割り当てられます。同様のことが、次の形式のLABEL文を用いてもできます。
name LABEL size
sizeには、次表に示される項目のいずれかを指定します。この結果として、現在のﾛｹｰｼｮﾝ･ｶｳﾝﾀの値がsizeで指定される属性で、nameを用いて参照できます。従って、同一のｱﾄﾞﾚｽを異なる属性で参照することが可能となります。また、命令のｱﾄﾞﾚｽ参照では、次の形式が使用できます。
label LABEL type

 ■
LABEL,THIS,PTR文のｵﾍﾟﾗﾝﾄﾞで指定する属性
種類 | 指定の内容 | 属性
size
BYTE
ﾊﾞｲﾄ･ﾃﾞｰﾀ
SBYTE
符号付きﾊﾞｲﾄ･ﾃﾞｰﾀ
WORD
ﾜｰﾄﾞ･ﾃﾞｰﾀ
SW0RD
符号付きﾜｰﾄﾞ･ﾃﾞｰﾀ
DWORD
ﾀﾞﾌﾞﾙﾜｰﾄﾞ･ﾃﾞｰﾀ
SDW0RD
符号付きﾀﾞﾌﾞﾙﾜｰﾄﾞ･ﾃﾞｰﾀ
FW0RD
farﾜｰﾄﾞ･ﾃﾞｰﾀ
QWORD
ｸﾜｯﾄﾞﾜ-ﾄﾞ･ﾃﾞｰﾀ
TBYTE
10ﾊﾞｲﾄ･ﾃﾞ-ﾀ
REAL4
4ﾊﾞｲﾄ実数ﾃﾞｰﾀ
REAL8
8ﾊﾞｲﾄ実数ﾃﾞ-ﾀ
REAL10
10ﾊﾞｲﾄ実数ﾃﾞｰﾀ
STRUCT定義の構造体名 | 属性は定義内容に依存
UNl0N定義の共用体名 | 属性は定義内容に依存
RECORD定義のﾚｺｰﾄﾞ名 | 属性は定義内容に依存
type
NEAR
NEAR16またはNEAR32(ｾｸﾞﾒﾝﾄ属性に依存)
FAR
FAR16またはFAR32(ｾｸﾞﾒﾝﾄ属性に依存)
NEAR16
16ﾋﾞｯﾄ属性のNEAR
FAR16
16ﾋﾞｯﾄ属性のFAR
NEAR32
32ﾋﾞｯﾄ属性のNEAR
FAR32
32ﾋﾞｯﾄ属性のFAR
PR0C
nearまたはfarの手続き(ﾃﾞﾌｫﾙﾄのﾒﾓﾘ･ﾓﾃﾞﾙによる)

■ THIS演算子

 THIS演算子を使用すると、指定された属性で、現在のﾛｹｰｼｮﾝ･ｶｳﾝﾀをもつｵﾍﾟﾗﾝﾄﾞを定義できます。
THIS size
THIS type
size, typeは前表のいずれかです。THIS演算子を使用すると、LABEL文と等価な別の記述が可能となります。
name  EQU THIS size
label EQU THIS type

■ PTR演算子

 定義ではなく、強制的に属性の変更(指定)を行なう場合はPTR演算子を使用します。
size PTR expr
type PTR expr
size, typeは前表のいずれかです。これは、前方参照のﾃﾞﾌｫﾙﾄやﾃﾞｰﾀのｻｲｽﾞを変更するときなどに使用します。特殊なPTRの使用法として、ﾎﾟｲﾝﾀ･ﾃﾞｰﾀの定義があります。sizeには、前表の内容が指定できます。また、exprとして、ﾎﾟｲﾝﾀの初期値を指定できます。
name WORD  size PTR expr
name DWORD size PTR expr
name FWORD size PTR expr

■ SHORT演算子

 ｼﾞｬﾝﾌﾟ命令で、short分岐を指定する場合は、SHORT演算子を記述します。通常はｱｾﾝﾌﾞﾗが効率的なｺｰﾄﾞを生成しますので、とくに記述する必要はありません。
      JMP SHORT label

■ ORG命令

 ﾃﾞｰﾀ定義または実行命令記述の文のｱｾﾝﾌﾞﾙ処理に従って、現在のｱｾﾝﾌﾞﾙ･ｱﾄﾞﾚｽを表わすﾛｹｰｼｮﾝ･ｶｳﾝﾀの内容が自動的に増加します。この値は記号$で参照できます。ﾛｹｰｼｮﾝ･ｶｳﾝﾀの値は、ORG命令を使用すれば強制的に変更できます。
      ORG address
ﾛｹ-ｼｮﾝ・ｶｳﾝﾀを変更
addressは、ｱﾄﾞﾚｽとして確定可能な式で、例えば記号$などが含められます。これに続く領域確保(ｱﾄﾞﾚｽ割り当て)は、ｵﾍﾟﾗﾝﾄﾞで指定したｱﾄﾞﾚｽから開始されます。

 ■ EVEN命令

 ﾃﾞｰﾀ領域の確保などで、とくにｱﾄﾞﾚｽ境界を偶数番地に合せたい(整列させる)ときは、次のEVEN命令を使用します。
      EVEN
偶数ｱﾄﾞﾚｽに整列
これに続く領域確保(割り当て)は、偶数のｱﾄﾞﾚｽからになります。もし、現在のﾛｹｰｼｮﾝ･ｶｳﾝﾀが奇数ならば、1ﾊﾞｲﾄのｺｰﾄﾞまたはﾃﾞｰﾀを挿入することで、ｱﾄﾞﾚｽが調整されます。

 ■ ALIGN命令

 一般的なｱﾄﾞﾚｽ境界の整合には、次のALIGN命令を使用します。
      ALIGN n
nには2のべき乗の値(2, 4, 8, 16,…)を指定します。必要ならば、ｱﾄﾞﾚｽが調整されます。nに2を指定すれば、EVENと等価となります。

 ｱﾄﾞﾚｽ境界の調整では、ｾｸﾞﾒﾝﾄ定義SEGMENT文でのｱﾗｲﾒﾝﾄの指定が影響します。例えば、BYTEｱﾗｲﾒﾝﾄのｾｸﾞﾒﾝﾄでは、ｱﾄﾞﾚｽ整列の命令は使用できません。ｾｸﾞﾒﾝﾄ定義でのｱﾗｲﾒﾝﾄとｱﾄﾞﾚｽ整列命令の関係を次に示します。
 ■
ｾｸﾞﾒﾝﾄでのｱﾗｲﾒﾝﾄとｱﾄﾞﾚｽ整列命令の関係
ｱﾗｲﾒﾝﾄ ｱﾄﾞﾚｽ境界の指定
BYTE
指定不可
WORD
EVENまたはALlGN 2
DWORD
EVENまたはALIGN n (n=2,4)
PARA
EVENまたはALIGN n (n=2,4,8,16)
PAGE
EVENまたはALIGN n (n=2,4,8,16,32,64,128,256)
ｱﾄﾞﾚｽ境界の整合は、8088/80188などのﾃﾞｰﾀ･ﾊﾞｽが8ﾋﾞｯﾄのﾏｲｸﾛﾌﾟﾛｾｯｻではあまり意味をもちません。しかし、ﾃﾞｰﾀ･ﾊﾞｽが16ﾋﾞｯﾄまたは32ﾋﾞｯﾄのﾏｲｸﾛﾌﾟﾛｾｯｻでは、偶数ｱﾄﾞﾚｽのﾜｰﾄﾞ境界または4の倍数のｱﾄﾞﾚｽのﾀﾞﾌﾟﾙﾜｰﾄﾞ境界を指定することで、ﾊｰﾄﾞｳｪｱのﾊﾞｽの転送効率を上げられ、これはﾏｲｸﾛﾌﾟﾛｾｯｻのﾌﾟﾛｸﾞﾗﾑ実行時間に影響します。


ｾｸﾞﾒﾝﾄと手続き

4. ｾｸﾞﾒﾝﾄと手続き

ｾｸﾞﾒﾝﾄは、連続したﾃﾞｰﾀまたはｺｰﾄﾞの論理的な集りです。通常、ﾌﾟﾛｸﾞﾗﾑは複数のｾｸﾞﾒﾝﾄで構成されます。ｾｸﾞﾒﾝﾄの記述では、記述の開始と終了、属性などを正確に指定する必要があります。しかし、簡略化ｾｸﾞﾒﾝﾄの記述を利用すれば、比較的容易にｾｸﾞﾒﾝﾄを定義できます。
4.1 簡略化ｾｸﾞﾒﾝﾄの記述
4.2 完全なｾｸﾞﾒﾝﾄの記述
4.3 手続きの記述


簡略化ｾｸﾞﾒﾝﾄの記述

4.1 簡略化ｾｸﾞﾒﾝﾄの記述

■ .MODEL文

 簡略化ｾｸﾞﾒﾝﾄでは、.MODEL文でﾒﾓﾘ･ﾓﾃﾞﾙを指定します。複数のﾒﾓﾘ･ﾓﾃﾞﾙが存在する理由は、異なるﾎﾟｲﾝﾀ･ｻｲｽﾞが存在するためです。例えば、手続きにnearとfarが存在するのも同じ理由からです。これは、ﾃﾞｰﾀに関しても同様で、ｺｰﾄﾞとﾃﾞｰﾀから、いくつかの組合わせが存在します。以下に.MODEL文で指定できるﾒﾓﾘ･ﾓﾃﾞﾙを示します。

 ﾃﾞｰﾀのfarﾎﾟｲﾝﾀは、特定の1個のｾｸﾞﾒﾝﾄに対するもので、これを用いても、通常確保される連続領域はｾｸﾞﾒﾝﾄのｻｲｽﾞを超えられません。従って、配列のｻｲｽﾞの最大は64Kﾊﾞｲﾄとなります。ただし、64Kﾊﾞｲﾄ以下の配列を複数確保することはできます。しかし、ﾎﾟｲﾝﾀの扱いを工夫すれば、64Kﾊﾞｲﾄを超える領域を操作するのに特に問題はありません。
■ ﾒﾓﾘ･ﾓﾃﾞﾙの種類
ﾒﾓﾘ･ﾓﾃﾞﾙ ｺｰﾄﾞの指定 ﾃﾞｰﾀの指定 備考
TINY
nearﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以下) nearﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以下) ｺｰﾄﾞとﾃﾞ-ﾀを合せて64Kﾊﾞｲﾄ以下
SMALL
nearﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以下) nearﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以下) ｺｰﾄﾞとﾃﾞｰﾀはそれぞれ64Kﾊﾞｲﾄ以下
MEDIUM
farﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以上) nearﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以下) ﾃﾞｰﾀは64Kﾊﾞｲﾄ以下
COMPACT
nearﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以下) farﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以上) ｺ-ﾄﾞは64kﾊﾞｲﾄ以下
LARGE
farﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以上) farﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以上)
HUGE
farﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以上) farﾎﾟｲﾝﾀ(64Kﾊﾞｲﾄ以上)
FLAT
nearﾎﾟｲﾝﾀ nearﾎﾟｲﾝﾀ 32ﾋﾞｯﾄのnearﾎﾟｲﾝﾀで、合計4Gﾊﾞｲﾄ以下

◆ ﾀｲﾆｨ･ﾒﾓﾘ･ﾓﾃﾞﾙ (TlNY)

MS-DOSのCOM形式に限定されるﾌﾟﾛｸﾞﾗﾑで、ｺｰﾄﾞとﾃﾞｰﾀは1個のｾｸﾞﾒﾝﾄを共有します。ｽﾀｯｸはこのｾｸﾞﾒﾝﾄの最後に自動的に確保されるため、定義する必要はありません。ただし、ｽﾀｯｸのｻｲｽﾞを含めて、ﾌﾟﾛｸﾞﾗﾑは64Kﾊﾞｲﾄ以下でなければなりません。.STARTUP文を使用しない場合は、ORG文で100Hから実行命令を記述する必要があります。このﾒﾓﾘ･ﾓﾃﾞﾙは比較的小さなﾌﾟﾛｸﾞﾗﾑの場合に使用されます。farﾎﾟｲﾝﾀに関する指定は使用できません。

 ◆ ｽﾓ-ﾙ･ﾒﾓﾘ･ﾓﾃﾞﾙ (SMALL)

ｺｰﾄﾞとﾃﾞｰﾀの2個のｾｸﾞﾒﾝﾄから構成されるﾌﾟﾛｸﾞﾗﾑです。ｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀの内容を変更するfarﾎﾟｲﾝﾀを使用しないために、ﾌﾟﾛｸﾞﾗﾑの実行時間に関しては効率的です。

 ◆ ﾐﾃﾞｨｱﾑ･ﾒﾓﾘ･ﾓﾃﾞﾙ (MEDlUM)

ｽﾓｰﾙ･ﾒﾓﾘ･ﾓﾃﾞﾙと比較して、複数のｺｰﾄﾞ･ｾｸﾞﾒﾝﾄが使用可能です。ｺｰﾄﾞ領域が64Kﾊﾞｲﾄを越える場合に使用します。ただし、ｺｰﾄﾞは64Kﾊﾞｲﾄ以下の複数のｾｸﾞﾒﾝﾄに分割する必要があります。

 ◆ ｺﾝﾊﾟｸﾄ･ﾒﾓﾘ･ﾓﾃﾞﾙ (C0MPACT)

ｽﾓｰﾙ･ﾒﾓﾘ･ﾓﾃﾞﾙと比較して、複数のﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄが使用可能です。ﾃﾞｰﾀ領域が64Kﾊﾞｲﾄを越える場合に使用します。ただし、ﾃﾞｰﾀは64Kﾊﾞｲﾄ以下の複数のｾｸﾞﾒﾝﾄに分割する必要があります。

 ◆ ﾗｰｼﾞ･ﾒﾓﾘ･ﾓﾃﾞﾙ (LARGE)

ｺｰﾄﾞとﾃﾞｰﾀがそれぞれ複数のｾｸﾞﾒﾝﾄから構成されるﾌﾟﾛｸﾞﾗﾑです。ﾌﾟﾛｸﾞﾗﾑのｻｲｽﾞは、実行時の利用可能なﾒﾓﾘ･ｻｲｽﾞで制限されます。

 ◆ ﾋｭｰｼﾞ･ﾒﾓﾘ･ﾓﾃﾞﾙ (HUGE)

ｱｾﾝﾌﾞﾙの処理上はﾗｰｼﾞ･ﾒﾓﾘ･ﾓﾃﾞﾙと同等です。ﾋｭｰｼﾞは、ﾃﾞｰﾀに関して複数の隣接したｾｸﾞﾒﾝﾄの操作を可能とし、ｺﾝﾊﾟｲﾗ言語でｻﾎﾟｰﾄされています。ｱｾﾝﾌﾞﾘ言語では、ﾕｰｻﾞがｾｸﾞﾒﾝﾄ配置と処理を記述する必要があります。

 ◆ ﾌﾗｯﾄ･ﾒﾓﾘ･ﾓﾃﾞﾙ (FLAT)

 80386ﾌｧﾐﾘの32ﾋﾞｯﾄ属性ｾｸﾞﾒﾝﾄでは、ｺｰﾄﾞとﾃﾞｰﾀを含む1個のｾｸﾞﾒﾝﾄからなるﾌﾟﾛｸﾞﾗﾑを作成できます。ｵﾌｾｯﾄに32ﾋﾞｯﾄが使用され、ﾌﾟﾛｸﾞﾗﾑ･ｻｲｽﾞの最大値は4Gﾊﾞｲﾄです。

 TINYの場合を除いて、ﾌﾟﾛｸﾞﾗﾑは、EXE形式となります。簡略化ｾｸﾞﾒﾝﾄの.MODEL文は、ｾｸﾞﾒﾝﾄの記述の前に指定する必要があります。ただし、80386/80486ﾏｲｸﾛﾌﾟﾛｾｯｻを指定する文の記述位置の影響を受け、これが.MODEL文よりも前に位置すると、ｾｸﾞﾒﾝﾄの属性が32ﾋﾞｯﾄに、後に位置するとﾃﾞﾌｫﾙﾄの16ﾋﾞｯﾄになります。
      .MODEL memory_model{,option}
memory_modelには前表に示されているものを指定します。optionには、次に示す言語型、実行環境、ｽﾀｯｸのｵﾌﾟｼｮﾝを必要に応じて指定可能です。ｵﾌﾟｼｮﾝで言語型を指定すると、PROC文で定義されている手続きの名前は、すべてﾊﾟﾌﾞﾘｯｸ名になります。また、PROC文のｻｲｽﾞ(NEAR, FAR)のﾃﾞﾌｫﾙﾄは、ﾒﾓﾘ･ﾓﾃﾞﾙのｺｰﾄﾞのﾎﾟｲﾝﾀと同じになります。

 言語型

 ﾌﾟﾛｼ-ｼﾞｬ呼び出し規約とﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾟﾙの処理方法を指定します。ﾃﾞﾌｫﾙﾄはなく、この指定は他の設定に影響を与えます。以下の6種類が指定可能です。
言語型 該当処理
C
①③⑤⑦
SYSCALL
③⑦
STDCALL
①③⑥⑦
PASCAL
②④
F0RTRAN
②④
BASlC
②④
① | ﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾞﾙの先頭に_(下線)を付加する。
② | 英字を大文宇に変換する。
③ | 引数を記述とは逆の順序でｽﾀｯｸにﾌﾟｯｼｭする。
④ | 引数を記述の順序でｽﾀｯｸへﾌﾟｯｼｭする。
⑤ | 引数用ｽﾀｯｸは呼ぴ出し側で開放する。
⑥ | VARARG使用時は呼び出し側で、未使用時は手続き側で、引数用ｽﾀｯｸを開放する。
⑦ | VARARG(個数可変の引数指定)が使用できる。

実行環境

 .STARTUPと.EXITの処理内容を指定します。ﾃﾞﾌｫﾙﾄは0S_D0Sです。
実行環境 該当処理
OS_DOS
MS-D0S
OS_OS2
OS/2

ｽﾀｯｸ

 ｽﾀｯｸの割り当て方法を指定します。ﾃﾞﾌｫﾙﾄはNEARSTACKです。
ｽﾀｯｸ 該当処理
NEARSTACK
ｸﾞﾙ-ﾌﾟDGROUPに割り当てます
FARSTACK
ｸﾞﾙ-ﾌﾟDGR0UPとは別のｾｸﾞﾒﾝﾄに割り当てます

.MODEL文でﾒﾓﾘ･ﾓﾃﾞﾙを指定した後は、次表に示す簡略化ｾｸﾞﾒﾝﾄの定義文を用いて、ｾｸﾞﾒﾝﾄを記述します。
■ 簡略化ｾｸﾞﾒﾝﾄの種類
定義文 ｾｸﾞﾒﾝﾄ名 ｾｸﾞﾒﾝﾄの種類
.C0DE    {name}
name
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ
.C0NST
C0NST
定数nearﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.DATA
_DATA
初期化nearﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.DATA?
_BSS
未初期化nearﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.STACK   {size}
STACK
size(ﾃﾞﾌｫﾙﾄは1024)ﾊﾞｲﾄのｽﾀｯｸ･ｾｸﾞﾒﾝﾄ
.FARDATA {name}
name
初期化farﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
.FARDATA {name}
name
未初期化farﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ
このとき定義されるｾｸﾞﾒﾝﾄの名前と属性は、次表に示すようになります。
■ ﾒﾓﾘ･ﾓﾃﾞﾙに対するﾃﾞﾌｫﾙﾄのｾｸﾞﾒﾝﾄ
ﾒﾓﾘ･ﾓﾃﾞﾙ 定義文 ｾｸﾞﾒﾝﾄ名 ｱﾗｲﾝ
align 		結合型
combine 		ｸﾗｽ
'class' 		ｸﾞﾙｰﾌﾟ
TlNY
.CODE
_TEXT
WORD
PUBLIC
'CODE'
DGROUP
SMALL
.CODE
_TEXT
WORD
PUBLIC
'CODE'
MEDIUM
.CODE
name_TEXT
WORD
PUBLIC
'CODE'
COMPACT
.CODE
_TEXT
W0RD
PUBLlC
'CODE'
.FARDATA
FAR_DATA
PARA
PRlVATE
'FAR_DATA'
.FARDATA?
FAR_BSS
PARA
PRIVATE
'FAR_BSS'
LARGE
.CODE
name_TEXT
WORD
PUBLIC
'C0DE'
HUGE
.FARDATA
FAR_DATA
PARA
PRIVATE
'FAR_DATA'
.FARDATA?
FAR_BSS
PARA
PRIVATE
'FAR_BSS'
上記に共通
.C0NST
C0NST
W0RD
PUBLIC
'CONST'
DGR0UP
.DATA
_DATA
W0RD
PUBLIC
'DATA'
DGR0UP
.DATA?
_BSS
W0RD
PUBLIC
'BSS'
DGR0UP
.STACK
STACK
PARA
STACK
'STACK'
DGR0UP注
FLAT
.C0DE
_TEXT
DW0RD
PUBLIC
'C0DE'
.FARDATA
_DATA
DW0RD
PUBLlC
'DATA'
.FARDATA?
_BSS
DW0RD
PUBLlC
'BSS'
.CONST
_CONST
DW0RD
PUBLlC
'C0NST'
.DATA
_DATA
DW0RD
PUBLlC
'DATA'
.DATA?
_BSS
DW0RD
PUBLIC
'BSS'
.STACK
STACK
DWORD
PUBLlC
'STACK'
注: | FARSTACK属性が指定されている場合、.STACKはDGROUPに属しません。
① | 32ﾋﾞｯﾄ属性ｾｸﾞﾒﾝﾄの場合は、ｱﾗｲﾝのWORDはDWORDとなります。
② | name_TEXTのnameには、ﾃﾞﾌｫﾙﾄとしてﾌｧｲﾙのﾍﾞｰｽ名が使用されます。
簡略化ｾｸﾞﾒﾝﾄを用いると、自動的に必要なGROUP文とASSUME文が生成されます。また、次表に示されている等価記号(ﾃｷｽﾄ･ﾏｸﾛ)が使用できます。開始した簡略化ｾｸﾞﾒﾝﾄは、別のｾｸﾞﾒﾝﾄの開始またはEND文で終了しますが、強制的に現在のｾｸﾞﾒﾝﾄを終了させるには、次の形式を使用します。
@CurSeg ENDS
■ 簡略ｾｸﾞﾒﾝﾄ記述における等価記号の概要
ｼﾝﾎﾞﾙ 内容
@Model
ﾒﾓﾘ･ﾓﾃﾞﾙ
@CurSeg
現在のｾｸﾞﾒﾝﾄの名前
@CodeSize
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄのﾎﾟｲﾝﾀ･ｻｲｽﾞ
@DataSize
ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄのﾎﾟｲﾝﾀ･ｻｲｽﾞ
@code
.C0DEで定義されるｾｸﾞﾒﾝﾄ名
@data
nearﾃﾞｰﾀのｸﾞﾙｰﾌﾟDGR0UP
@stack
.STACKで定義されるｾｸﾞﾒﾝﾄ名
@fardata
.FARDATAで定義されるｾｸﾞﾒﾝﾄ名
@fardata?
.FARDATA?で定義されるｾｸﾞﾒﾝﾄ名
@WordSize
ﾏｲｸﾛﾌﾟﾛｾｯｻのﾜｰﾄﾞ･ｻｲｽﾞ


完全なｾｸﾞﾒﾝﾄの記述

4.2 完全なｾｸﾞﾒﾝﾄの記述

■ SEGMENT文、ENDS文

 完全なｾｸﾞﾒﾝﾄの記述では、SEGMENT文とENDS文を使用します。また、SEGMENT文のｵﾍﾟﾗﾝﾄﾞでｾｸﾞﾒﾝﾄの属性を必要に応じて指定します。
sname SEGMENT {align} {READONLY} {combine} {use} {'class'}
      …
      …
sname ENDS

snameはｾｸﾞﾒﾝﾄ名を表わし、ｿｰｽ･ﾌｧｲﾙ内で同じ名前をもつｾｸﾞﾒﾝﾄは同一のｾｸﾞﾒﾝﾄの記述として処理されます。また、他のｿｰｽ･ﾌｧｲﾙに含まれるｾｸﾞﾒﾝﾄで、ﾘﾝｸ時に1つに結合するには同じ名前を使用します。

 alignには、次表のいずれかを必要に応じて指定します。これにより、ｾｸﾞﾒﾝﾄの先頭ｱﾄﾞﾚｽが調整されます。ﾃﾞﾌｫﾙﾄはｾｸﾞﾒﾝﾄ属性により異なり、16ﾋﾞｯﾄではPARA、32ﾋﾞｯﾄではDW0RDとなります。
align ｾｸﾞﾒﾝﾄの開始ｱﾄﾞﾚｽ
BYTE
ﾊﾞｲﾄ･ｱﾄﾞﾚｽ(任意のｱﾄﾞﾚｽ)
WORD
ﾜ-ﾄﾞ･ｱﾄﾞﾚｽ(偶数ｱﾄﾞﾚｽ)
DWORD
ﾀﾞﾌﾞﾙﾜｰﾄﾞ･ｱﾄﾞﾚｽ(4の倍数ｱﾄﾞﾚｽ)
PARA
ﾊﾟﾗｸﾞﾗﾌ･ｱﾄﾞﾚｽ(16の倍数ｱﾄﾞﾚｽ)
PAGE
ﾍﾟｰｼﾞ･ｱﾄﾞﾚｽ(256の倍数ｱﾄﾞﾚｽ)

READONLYは、ｾｸﾞﾒﾝﾄに読み出し専用の属性を与え、これが指定されていると、ｱｾﾝﾌﾞﾗがこのｾｸﾞﾒﾝﾄに属する項目の変更(書き込み)命令を検出するとｴﾗｰとします。

 combine(結合型)では、次表に示すものを指定して、複数のｿｰｽ･ﾌｧｲﾙに含まれる同名のｾｸﾞﾒﾝﾄの、ﾘﾝｸ時の結合方法を指定します。ﾃﾞﾌｫﾙﾄはPRIVATEです。
combine 結合方法
PUBLIC
同じ名前のｾｸﾞﾒﾝﾄを1個の連続した領域に割り当てる。ｵﾌｾｯﾄは、結合後のｾｸﾞﾒﾝﾄの先頭からの距離となる。
STACK
同じ名前のｾｸﾞﾒﾝﾄを1個の連続した領域に割り当てる。ｱﾄﾞﾚｽはSSﾚｼﾞｽﾀ相対で、SPはｾｸﾞﾒﾝﾄの長さに初期化。
C0MM0N
同じ名前のｾｸﾞﾒﾝﾄを同じ開始ｱﾄﾞﾚｽから重複して割り当てる。領域のｻｲｽﾞは最大のｾｸﾞﾒﾝﾄに一致する。複数のｾｸﾞﾒﾝﾄで初期化が指定されている場合、後に結合されたｾｸﾞﾒﾝﾄが優先する。
MEM0RY
同じ名前のｾｸﾞﾒﾝﾄを1個の連続した領域に割り当てる。(PUBLICと同等)
AT address
指定ｱﾄﾞﾚｽからｾｸﾞﾒﾝﾄを割り当てる(ｱｾﾝﾌﾞﾙ時には何も生成されず，単に絶対ｱﾄﾞﾚｽの参照に使用する)。
PRlVATE
同じ名前のｾｸﾞﾒﾝﾄであっても結合しない。

use(ﾜｰﾄﾞ・ｻｲｽﾞ)には、80386/80486のﾏｲｸﾛﾌﾟﾛｾｯｻを指定した場合にのみ、ﾃﾞﾌｫﾙﾄのﾜｰﾄﾞ･ｻｲｽﾞを次表のいずれかで指定します。ここでのﾜｰﾄﾞ･ｻｲｽﾞは、ｵﾍﾟﾗﾝﾄﾞとｱﾄﾞﾚｽのｻｲｽﾞの意味で、WORDまたはDWORDの指定とは関係ありません。ﾃﾞﾌｫﾙﾄはｾｸﾞﾒﾝﾄ属性により異なり、16ﾋﾞｯﾄではUSE16、32ﾋﾞｯﾄではUSE32となります。
use 指定内容
USE16
ﾜｰﾄﾞ･ｻｲｽﾞのﾃﾞﾌｫﾙﾄは16ﾋﾞｯﾄ(ｾｸﾞﾒﾝﾄの最大ｻｲｽﾞは64Kﾊﾞｲﾄ)
USE32
ﾜｰﾄﾞ･ｻｲｽﾞのﾃﾞﾌｫﾙﾄは32ﾋﾞｯﾄ(ｾｸﾞﾒﾝﾄの最大ｻｲｽﾞは4Gﾊﾞｲﾄ)
FLAT
ﾌﾗｯﾄ･ﾒﾓﾘ･ﾓﾃﾞﾙの32ﾋﾞｯﾄ(ｾｸﾞﾒﾝﾄの最大ｻｲｽﾞは4Gﾊﾞｲﾄ)

'class'には、ｸﾗｽを表わす名前を指定します。これが省略された場合は、ﾇﾙ･ｸﾗｽ(nuIl class)が割り当てられます。同じ名前のｸﾗｽに属するｾｸﾞﾒﾝﾄは、連続して配置されます。ｸﾗｽに属するｾｸﾞﾒﾝﾄの個数やｸﾗｽ全体のｻｲｽﾞに制限はありません。ただし、ｾｸﾞﾒﾝﾄの順序やｸﾗｽの位置は他の条件で決まります。なお、ｸﾗｽ名が'CODE'またはｸﾗｽ名がCODEで終わるものは、ﾌﾟﾛｸﾞﾗﾑのｺｰﾄﾞが含まれるもの(ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ)とみなされます。これは、PWBでﾃﾞﾊﾞｯｸﾞする場合は重要となります。
参考: 簡略化ｾｸﾞﾒﾝﾄで使用されるｸﾗｽ名

■ ASSUME文

 ｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀに設定される内容は、次のASSUME文でｱｾﾝﾌﾞﾗに指示します。
      ASSUME sreg:bname{,sreg:bname,…}
sregにはｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀ名(CS, DS, SS, ES, FS, GS)、bnameには次のいずれかを指定します。
・ | ｾｸﾞﾒﾝﾄ名
・ | ｸﾞﾙｰﾌﾟ名
・ | SEG式
・ | N0THING(特定のｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀの指定を無効にする)
・ | ERROR(特定のｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀの使用をｴﾗｰとする)
・ | FLAT(ﾌﾗｯﾄ･ﾒﾓﾘ･ﾓﾃﾞﾙの場合)
・ | 上記のいずれかに評価される等価記号
ただし、CSに関してはｱｾﾝﾌﾞﾗが自動的に仮定しますので、省略可能です。ASSUMEによるすべての指定を無効にするには、次の記述を使用します。
      ASSUME NOTHING
ﾚｼﾞｽﾀのﾃﾞﾌｫﾙﾄ型の定義も無効

■ .SEQ文

ｿｰｽ･ﾌｧｲﾙに記述されている順序で、ｱｾﾝﾌﾞﾙ時のｵﾌﾟｼﾞｪｸﾄにｾｸﾞﾒﾝﾄを出力する場合は、最初に.SEQ文を指定します。ただし、これはﾃﾞﾌｫﾙﾄなので省略可能です。
  .SEQ
ｾｸﾞﾒﾝﾄを記述順に出力

■ .ALPHA文

ｵﾌﾞｼﾞｪｸﾄの作成で、ｾｸﾞﾒﾝﾄ名のｱﾙﾌｧﾍﾞｯﾄ順にｾｸﾞﾒﾝﾄを出力する場合は、先頭で.ALPHA文を指定します。
  .ALPHA
ｾｸﾞﾒﾝﾄをｱﾙﾌｧﾍﾞｯﾄ順に出力

■ .DOSSEG文

.DOSSEG文を指定すれば、MS-DOSやOS/2のｺﾝﾊﾟｲﾗ言語で使用されている順序で、ﾘﾝｸ時にｾｸﾞﾒﾝﾄを配置できます。
  .DOSSEG
このとき、以下の順序でｾｸﾞﾒﾝﾄが配置されます。この指定により、ﾘﾝｶは特殊なｼﾝﾎﾞﾙ_endと_edataを自動的に生成します。
① | ｸﾗｽ名が'C0DE'で終わるすべてのｾｸﾞﾒﾝﾄ(ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ)
② | DGROUP以外のｾｸﾞﾒﾝﾄ
③ | DGROUPに属する、ｸﾗｽ名が'BEGDATA'のｾｸﾞﾒﾝﾄ(このｸﾗｽは予約されている)
④ | DGROUPに属する、下記以外のｸﾗｽ('CONST'、'DATA'など)のｾｸﾞﾒﾝﾄ
⑤ | DGROUPに属する、ｸﾗｽ名が'BSS'のｾｸﾞﾒﾝﾄ
⑥ | DGROUPに属する、ｸﾗｽ名が'STACK'のｾｸﾞﾒﾝﾄ
ｵﾌﾞｼﾞｪｸﾄへのｾｸﾞﾒﾝﾄの出力順序は、前記の方法で指定できますが、ﾌﾟﾛｸﾞﾗﾑが複数のｵﾌﾞｼﾞｪｸﾄ(ｿｰｽ･ﾌｧｲﾙ)で構成されるような場合には、必要に応じてSEGMENT文とENDS文だけのｾｸﾞﾒﾝﾄを使用して、ﾘﾝｸ時のｾｸﾞﾒﾝﾄ順序を制御できます。ただし、ﾘﾝｸ時のｾｸﾞﾒﾝﾄの結合では、前記の指定以外に、ｾｸﾞﾒﾝﾄの属性であるｸﾗｽ名も関連します。

 完全なｾｸﾞﾒﾝﾄ記述でも、ｾｸﾞﾒﾝﾄに関する等価記号内の簡略化ｾｸﾞﾒﾝﾄだけに関するもの以外の等価記号を使用できます。


手続きの記述

4.3 手続きの記述

手続きはPROC文とENDP文間に次の形式で記述します。
pname PROC {attr} {USES reg {reg…}{,para{,…}
      …
      …
      RET
属性に依存してRETFまたはRETNに変更される
pname ENDP
pnameは手続き名です。attrは種々の属性が指定でき、次の各項目内から各々1つが指定可能です。

 ■ 距離

 手続き呼び出しでのｱﾄﾞﾚｽに関する属性をNEAR, FAR, NEAR16, FAR16, NEAR32, FAR32から指定します。ﾃﾞﾌｫﾙﾄはﾒﾓﾘ･ﾓﾃﾞﾙ、言語型またはｾｸﾞﾒﾝﾄのｻｲｽﾞから決まります。NEARまたはFARは、ｾｸﾞﾒﾝﾄの属性から、それぞれNEAR16, NEAR32またはFAR16, FAR32になります。

 ■ 言語型

 言語に依存する引数の扱いなどの呼び出し規約をC, SYSCALL, STDCALL, PASCAL, F0RTRAN, BASICから指定します。

 ■ 可視性

 他のﾓｼﾞｭｰﾙからの呼び出しの可否(可視性)を指定します。ﾃﾞﾌｫﾙﾄはPUBLICです。
PUBLIC
他のﾓｼﾞｭｰﾙからも参照可能とします。
PRIVATE
記述ﾓｼﾞｭｰﾙ内だけでの参照とします。
EXP0RT
ｴｸｽﾎﾟｰﾄ･ﾃｰﾌﾞﾙへの登録を指定します。

■ ｺｰﾄﾞ生成

 ﾌﾟﾛﾛｰｸﾞ(手続き実行開始時)とｴﾋﾟﾛｰｸﾞ(手続き実行終了時)のｺｰﾄﾞ生成方法を指定します。仮引数または局所変数が用いられている場合のﾃﾞﾌｫﾙﾄはF0RCEFRAMEです。このいずれも用いられていない場合、ｺｰﾄﾞは生成されません。RETN, RETFまたはｵﾍﾟﾗﾝﾄﾞをもつRET命令を使用すると、ｴﾋﾟﾛｰｸﾞのｺｰﾄﾞは生成されません。
F0RCEFRAME
ｺｰﾄﾞ生成を指定します。
L0ADDS
ｺｰﾄﾞを生成し、DSを保存して初期化します。
<引数>
ﾌﾟﾛﾛｰｸﾞ･ﾏｸﾛに渡す内容を指定します。

USESでは、手続きの開始(ﾌﾟﾛﾛｰｸﾞ)でｽﾀｯｸに保存し、手続きの終了(ｴﾋﾟﾛｰｸﾞ)で復元すべきﾚｼﾞｽﾀを、複数の場合はｽﾍﾟｰｽで区切って指定します。

 最後のparaは、呼出し側でｽﾀｯｸにﾌﾟｯｼｭされて手続きに渡される引数で、次の形式のﾘｽﾄを記述します。仮引数は、引数名に続けて、必要ならば:(ｺﾛﾝ)と型指定子を記述します。とくに、最後の仮引数の型には、言語型がC, SYSCALLまたはSTDCALLの場合に、C言語と類似の引数の個数が可変のVARARGが指定できます。
name{:type}
typeには、次に示すいずれかを指定します。下記のsizeは変数の型指定子または構造体の名前です。PTRが指定されていても、ﾎﾟｲﾝﾀから値を得るためのｺｰﾄﾞが自動的に生成されることはありません。
size
引数は値で、省略時のﾃﾞﾌｫﾙﾄはW0RD(32ﾋﾞｯﾄ属性ではDW0RD)です。
PTR
引数はﾎﾟｲﾝﾀで、ﾒﾓﾘ･ﾓﾃﾞﾙとｾｸﾞﾒﾝﾄのｻｲｽﾞからﾎﾟｲﾝﾀの型が決まります。
PTR size
PTR指定と同じです。
NEAR PTR
16ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄではW0RDを、32ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄではDW0RDを仮定します。
FAR PTR
16ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄではDWORDを、32ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄではFWORDを仮定します。
NEAR PTR size
NEAR PTR指定と同じです。
FAR PTR size
FAR PTR指定と同じです。
引数を指定した場合、例えば次のような形式でｽﾀｯｸ･ﾌﾚｰﾑ(stack frame)が作成されます。呼び出す側でﾌﾟｯｼｭされた引数をｽﾀｯｸから取り除く言語型の場合は、RET命令がRET nに変更されます。
■ ｽﾀｯｸ･ﾌﾚｰﾑの作成と解放
pname PROC {attr} {USES reg {reg …}},para{,…}
      PUSH BP
BPﾚｼﾞｽﾀを保存
      MOV  BP,SP
ｽﾀｯｸ･ﾌﾚｰﾑの作成(ｽﾀｯｸ･ﾄｯﾌﾟを取得)
     {PUSH reg}
ﾚｼﾞｽﾀの退避
      …
手続きの内容
      …
      …
     {POP  reg}
ﾚｼﾞｽﾀの復元
      POP  BP
ｽﾀｯｸ･ﾌﾚｰﾑの解放(BPﾚｼﾞｽﾀ復帰)
      RET {n}
復帰 {引数用のｽﾀｯｸの解放}
pname ENDP
引数の使用に関しては、次の例を参考にしてください。
■ 手続きでの引数処理の例
ｿｰｽ･ﾌﾟﾛｸﾞﾗﾑ ｱｾﾝﾌﾞﾙの結果
      .MODEL SMALL,FORTRAN
      .MODEL SMALL,FORTRAN
      .CODE
      .CODE
name1 EQU    <WORD PTR [BP]+6>
引数指定のため自動生成
name2 EQU    <WORD PTR [BP]+4>
同上
PROC1 PROC   name1:WORD,name2:PTR
PROC1 PROC   name1:WORD,name2:PTR
      PUSH   BP
ｽﾀｯｸ･ﾌﾚｰﾑ作成処理のため自動生成
      MOV    BP,SP
同上
      …
      …
      MOV    AX,name1
      MOV    AX,name1
MOV AX,[BP]+6の意味
      MOV    BX,name2
      MOV    BX,name2
MOV BX,[BP]+4の意味
      …
      …
      POP    BP
ｽﾀｯｸ･ﾌﾚｰﾑ解放処理のため自動生成
      RET
      RET    4
同上
PROC1 ENDP
PROC1 ENDP

この例では、次の文が自動的に生成されて用いられています。これは、EQU文によるﾃｷｽﾄ･ﾏｸﾛ(text macro)の定義です。
name1 EQU <WORD PTR [BP]+6>
name2 EQU <WORD PTR [BP]+4>

■ LOCAL文

 手続き内だけで使用する局所的な変数をｽﾀｯｸに確保する場合は、次のLOCAL文を使用します。この文は手続きの最初に記述する必要があります。
        LOCAL variable{,variable,…}
variableは次の形式で指定します。
name{:type}
L0CAL文での単純変数の指定形式
name[n]{:type}
L0CAL文での配列変数の指定形式
nameは、通常の変数としてｵﾍﾟﾗﾝﾄﾞで参照でき、ｱｾﾝﾌﾞﾗが自動的に必要な変換を行ないます。配列の場合は先頭ｱﾄﾞﾚｽになります。typeは型指定子で、省略時は、16ﾋﾞｯﾄ属性ではW0RD、32ﾋﾞｯﾄ属性ではDWORDです。配列変数で、nは指定された型の要素の個数を表わします。

 L0CAL文の指定では、ｽﾀｯｸ･ﾌﾚｰﾑ作成後に、SPから変数の合計ｻｲｽﾞを減じることで領域をｽﾀｯｸに確保し、復帰前に領域の解放を行なう命令を自動的に挿入します。なお、確保時に領域の初期化は行なわれません。
■ L0CAL文での変数領域の確保と解放
pname PROC  {attr} {USES reg {reg…}{,para{,…}
      LOCAL variable{,variable,…}
      PUSH  BP
      MOV   BP,SP
      SUB   SP,total_size
ｽﾀｯｸに領域を確保(LOCAL文での変数の合計ﾊﾞｲﾄ数分)
     {push  reg}
      …
手続きの内容
      …
      …
     {pop   reg}
      MOV   SP,BP
ｽﾀｯｸの領域を解放
      POP   BP
      RET  {n}
pname ENDP
.MODEL文で言語を指定した場合、手続きに含まれるﾗﾍﾞﾙ、引数、さらにLOCAL文で指定されている変数は、その手続き内だけで有効です。従って、他の手続きに含まれるものとは無関係です。手続き内のﾗﾍﾞﾙで、外部からも参照可能とするためには、次のようにﾗﾍﾞﾙに2個のｺﾛﾝを付加します。
label:
手続き内だけで参照可能
label::
手続き外部からも参照可能

■ LABEL文による開始位置指定

手続きは、CALL命令で呼び出され、その先頭から実行が開始されます。先頭以外に、制御が渡される入口(entry point)を定義する場合は、LABEL文を使用します。更に、LABEL文を使用すると、PROCとENDPの文を用いないで手続きを記述できますが、属性に注意する必要があります。

 ■ 割り込み処理ﾙｰﾁﾝの形式

特殊な手続きである割り込み処理ﾙｰﾁﾝは、次の形式で記述できます。IRETの代りに、IRETF(FAR16の割り込み復帰)またはIRETFD(FAR32の割り込み復帰)も必要に応じて使用できます。この他に、処理ﾙｰﾁﾝの開始ｱﾄﾞﾚｽを、割り込みﾃｰﾌﾞﾙに登録する必要があります。
■ 割り込み処理ﾙｰﾁﾝの形式
pname PROC FAR {USES reg {reg {…}}}
      …
      …
      IRET
割り込みからの復帰命令
pname ENDP

■ ﾌﾟﾛﾄﾀｲﾌﾟ宣言

 C言語と同様に、手続きに対して、PROTO文を使用する、次の形式のﾌﾟﾛﾄﾀｲﾌﾟ宣言が記述できます。これは、後述のINVOKE文の使用で重要な意味をもち、引数の型のﾁｪｯｸを可能とします。
pname   PROTO {attr} {,para{,…}}
pnameは手続き名です。attrは属性で、距離と言語型だけが指定可能です。paraの指定はPROC文と同様で、変数名は省略可能です。手続きpnameで属性PRIVATEが指定されていなければ、pnameに対するEXTERNDEFを自動的に生成します。これを利用すれば、別のﾌｧｲﾙで定義されている手続きを呼び出す側でPROTO文を記述して、INVOKE文で簡単に呼び出せます。

 手続きの引数の受け渡しと、手続きからの復帰時のｽﾀｯｸの処理を自動的に行なうために、次のINVOKE文が使用できます。
        INVOKE pname{,arg{,…}
pnameは、手続き名または手続きの間接参照で、前方参照はできません。argには、引数として式をｶﾝﾏで区切って指定します。この式には、ﾚｼﾞｽﾀ、連続した2個のｺﾛﾝでﾚｼﾞｽﾀ名を連結したsreg::regの形式のFARｱﾄﾞﾚｽ、変数名(ﾗﾍﾞﾙ)にADDR演算子を用いたものなどが使用できます。なお、引数は必要に応じて型が変換され、この際にはﾚｼﾞｽﾀが使用されます。従って、ﾚｼﾞｽﾀをargに用いているとき、場合によっては値の受け渡しが正常に行なわれない可能性がありますので注意が必要です。INVOKE文での間接参照では、TYPEDEFまたはASSUMEを利用して、INVOKEの機能を生かせます。


等価記号

5. 等価記号

各種の値や文字列(string)を表わすｼﾝﾎﾞﾙを定義できます。このｼﾝﾎﾞﾙを等価記号(equate)と言います。また、とくにﾃｷｽﾄを表わす等価記号をﾃｷｽﾄ･ﾏｸﾛ(text macro)と呼びます。
5.1 等号(=)による定数定義
5.2 EQU文による定数定義
5.3 ﾃｷｽﾄ･ﾏｸﾛの定義と評価
5.4 ﾃｷｽﾄの操作
5.5 定義済みﾃｷｽﾄ･ﾏｸﾛ


等号(=)による定数定義

5.1 等号(=)による定数定義

等号を用いて、次のように値を表わすｼﾝﾎﾞﾙを定義できます。
name = expr
exprはｱｾﾝﾌﾞﾙ時に確定する定数式
expr(式)の評価結果をnameに割り当てます。exprの評価結果は、2ﾊﾞｲﾄ(32ﾋﾞｯﾄ属性の場合は4ﾊﾞｲﾄ)以内の整数型定数でなければなりません。この形式で定義されるnameは再定義可能なので、同一のnameを何度でも使用できます。この形式では値だけで、文字列は定義できません。
例:
count =  0
countを0に定義
      …
count =  count+1
countを1に再定義


EQU文による定数定義

5.2 EQU文による定数定義

EQU文を用いて、次のように値を表わすｼﾝﾎﾞﾙを定義できます。
name EQU expr
exprは数値として評価可能なもの
この定義の結果、ｼﾝﾎﾞﾙnameはexprの評価結果の定数値を持ちます。この形式で定義されるｼﾝﾎﾞﾙは再定義できません。次に使用例を示します。
例:
IMAX EQU 0FFFFH


ﾃｷｽﾄ･ﾏｸﾛの定義と評価

5.3 ﾃｷｽﾄ･ﾏｸﾛの定義と評価

■ EQU文による定義

 EQU文を用いて、次の形式で文字列を表わすｼﾝﾎﾞﾙを定義できます。
name EQU <string>
<>で囲まれた文字列
name EQU string
stringか式として評価されない場合
記号<>で囲む形式をﾘﾃﾗﾙ･ﾃｷｽﾄ(literal text)と呼びます。文字列にｽﾍﾟｰｽが含まれていなくて、式として評価されることがなければ、記号<>はEQU文では省略することも可能です。ただし、EQU文のｵﾍﾟﾗﾝﾄﾞでは、ﾏｸﾛ置換や式演算子(%)は適用されません。

 ■ TEXTEQU文による定義

 同様に、TEXTEQU文でも、ﾃｷｽﾄ･ﾏｸﾛを定義できます。ｵﾍﾟﾗﾝﾄﾞは常に文字列または文字列に評価されるものでなければなりません。
name TEXTEQU %expr
exprの評価結果を表わす文字列
name TEXTEQU <string>
TEXTEQU文のｵﾍﾟﾗﾝﾄﾞは、EQU文とは異なり、ﾏｸﾛ置換や式演算子%が適用されます。

 ﾈｰﾑ欄またはｵﾍﾟﾚｰｼｮﾝ欄に記述されたﾃｷｽﾄ･ﾏｸﾛは常に評価されますが、ｵﾍﾟﾗﾝﾄﾞ欄の場合は式演算子%が必要です。ｵﾍﾟﾗﾝﾄﾞ内の文字列で置き換えるべきｼﾝﾎﾞﾙの直前に式演算子を付加します。式演算子が行の最初の文字として記述され、その直後にｽﾍﾟｰｽまたはﾀﾌﾞがある場合は、この行に含まれるすべてのﾃｷｽﾄ･ﾏｸﾛを強制的に置き換えます。ただし、EQU文では、ﾈｰﾑ欄に記述されたｼﾝﾎﾞﾙが有効な名前として評価されず、ｴﾗｰとなる場合があります。これは、CATSTR文を用いれば可能です。

 ﾃｷｽﾄ･ﾏｸﾛで文字列を連結する場合は、置換演算子&を使用します。


ﾃｷｽﾄの操作

5.4 ﾃｷｽﾄの操作

ﾃｷｽﾄ･ﾏｸﾛの定義内容の文字列とﾘﾃﾗﾙ･ﾃｷｽﾄを操作するために、次に示す文と定義済みﾏｸﾛ関数が使用できます。
定義内容 文 定義済みﾏｸﾛ関数 動作
文字列
CATSTR
@CatStr()
文字列を連結する。
文字列
SUBSTR
@SubStr()
部分文宇列を求める。
値
SIZESTR
@SizeStr()
文字列のｻｲｽﾞを求める。
値
INSTR
@lnStr()
部分文宇列の位置を求める。
ﾏｸﾛ関数は文字列を返し、ｵﾍﾟﾗﾝﾄﾞやﾏｸﾛの引数などに使用できます。ｻｲｽﾞや位置に関するものは、現在の基数による数字列を返します。なお、定義内容としての文字列は最大255文字までです。

 ■ CATSTR文 (文宇列の連結)

文字列を連結するには、CATSTR文を使用します。ﾏｸﾛ関数@CatStr()を用いる場合は、次のようにTEXTEQU文を使用します。いずれの場合も、記述されている順序で連結した結果の文字列をnameに割り当てます。
name CATSTR <text>{,<text>,…}
CATSTR文の形式
name TEXTEQU @CatStr(<text>{,<text>,…})
@CatStr()の使用例

■ SUBSTR文 (部分文字列の抽出)

部分文字列を得るには、SUBSTR文を使用します。ﾏｸﾛ関数@SubStr()を用いる場合は、次のようにTEXTEQU文を使用します。いずれの場合も、部分文字列をnameに割り当てます。mは、抽出開始位置(先頭は1)、nは得られる部分文字列のｻｲｽﾞ(省略時は最後まで)です。
name SUBSTR <text>,m{,n}
SUBSTR文の形式
name TEXTEQU @SubStr(<text>,m{,n})
@SubStr()の使用例

■ SIZESTR文 (文字列のｻｲｽﾞ)

文字列のｻｲｽﾞを得るには、SIZESTR文を使用します。ﾏｸﾛ関数@SizeStr()を用いる場合は、次のようにTEXTEQU文を使用します。いずれの場合も、ｻｲｽﾞをnameに割り当てます。得られる結果は、0以上です。
name SIZESTR <text>
SIZESTR文の形式
name TEXTEQU @SizeStr(<text>)
@SizeStr()の使用例

■ INSTR文 (部分文字列の位置)

部分文字列の位置を得るには、INSTR文を使用します。ﾏｸﾛ関数@InStr()を用いる場合は、次のようにTEXTEQU文を使用します。いずれの場合も、部分文字列をnameに割り当てます。textの指定位置m(省略時は先頭)から部分文字列sub_textを検索し、含まれる位置(含まれていない場合は0)をnameに割り当てます。英字の大小は区別されます。
name INSTR {m,}<text>,<sub_text>
INSTR文の形式
name TEXTEQU @InStr({m,}<text>,<sub_text>)
@lnStr()の使用例


定義済みﾃｷｽﾄ･ﾏｸﾛ

5.5 定義済みﾃｷｽﾄ･ﾏｸﾛ

ｱｾﾝﾌﾞﾗが自動的に定義するものとして、ﾃｷｽﾄ･ﾏｸﾛとﾏｸﾛ関数があります。これらは、OPTION文のCASEMAP:NONEか起動時ｵﾌﾟｼｮﾝ/Cpが指定された場合、英字の大文字と小文字が区別されます。
■ 定義済みﾃｷｽﾄ･ﾏｸﾛ
@Code
.CODEで定義されるｾｸﾞﾒﾝﾄ名を表します。TINYﾒﾓﾘ･ﾓﾃﾞﾙの場合は、DGROUPに展開されます。
@CodeSize
ｺｰﾄﾞ･ﾎﾟｲﾝﾀがNEAR (TINY, SMALL, COMPACT, FLAT)の場合は0、FAR (MEDIUM, LARGE, HUGE)の場合は1を返します。
@Cpu
ﾌﾟﾛｾｯｻの指定を表す16ﾋﾞｯﾄの値を表します。
@CurSeg
現在のｾｸﾞﾒﾝﾄ名(ｾｸﾞﾒﾝﾄ内でなければ空白)を表します。
@data
FLATﾒﾓﾘ･ﾓﾃﾞﾙ以外で、.DATA, .DATA?, .CONST, .STACKで定義されるnearﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄDGROUPを表します。
@DataSize
ﾃﾞｰﾀ･ﾎﾟｲﾝﾀがNEAR (TINY, SMALL, COMPACT, FLAT)の場合は0、FAR (COMPACT, LARGE)の場合は1、HUGEの場合は2を表します。
@Date
ｱｾﾝﾌﾞﾙ処理時の日付("mm/dd/yy")を表します。
@fardata
.FARDATAで定義されるｾｸﾞﾒﾝﾄの名前(通常はFAR_DATA)を表します。
@fardata?
.FARDATA?で定義されるｾｸﾞﾒﾝﾄの名前(通常はFAR_BSS)を表します。
@FileCur
現在処理中の、ﾊﾟｽを含むｿｰｽ･ﾌｧｲﾙまたはｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙの名前を表します。
@FileName
ｺﾏﾝﾄﾞ･ﾗｲﾝで指定されているｱｾﾝﾌﾞﾘ対象のｿｰｽ･ﾌｧｲﾙのﾍﾞｰｽ名を表します。
@Interface
言語型とｵﾍﾟﾚｰﾃｨﾝｸﾞ･ｼｽﾃﾑを示すﾊﾞｲﾄ値を表します。
@Line
現在処理中のｿｰｽ･ﾌｧｲﾙまたはｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙの先頭を基準とする行番号を表します。
@Model
ﾒﾓﾘ･ﾓﾃﾞﾙを示す値を表します。
@stack
.stackで定義されるｾｸﾞﾒﾝﾄ名を表します。NEARSTACKではDGROUPに、FARSTACKではSTACKに展開されます。
@Time
ｱｾﾝﾌﾞﾙ処理時の時刻("hh:mm:ss")を表します。
@Version
ｱｾﾝﾌﾞﾗのﾊﾞｰｼﾞｮﾝ番号を示す3桁の数宇("600")を表します。
@WordSize
現在のｾｸﾞﾒﾝﾄのﾜｰﾄﾞ･ｻｲｽﾞを意味し、16ﾋﾞｯﾄの場合は2、32ﾋﾞｯﾄの場合は4を返します。
■ 定義済みﾏｸﾛ関数
@CatStr(<text>{,<text>,…})
複数の文字列を連結した結果を返します。
@Environ(var)
環境変数varに定義されている内容、(未定義の場合は空白)を返します。
@InStr ({m,}<text>,<sub_text>)
文字列text中の部分文字列sub_textの含まれる位置を返します。
@SizeStr(<text>)
文字列のｻｲｽﾞを返します。
@SubStr(<text>,m{,n})
文字列textから得た部分文字列を返します。


ﾏｸﾛ

6. ﾏｸﾛ

ﾏｸﾛを有効に利用すれば、ｿｰｽ･ﾌｧｲﾙの記述が簡単になるだけではなく、ｿｰｽ･ﾌｧｲﾙの変更なども容易に行なえます。通常、ﾏｸﾛと呼ばれるものはﾏｸﾛ･ﾌﾟﾛｼｰｼﾞｬ(ﾏｸﾛ手続き)で、ﾏｸﾛ関数とは区別されます。
6.1 ﾏｸﾛ手続き
6.2 繰り返しﾏｸﾛ
6.3 ﾏｸﾛ関数
6.4 ﾏｸﾛ演算子
6.5 ﾏｸﾛの特殊な定義


ﾏｸﾛ手続き

6.1 ﾏｸﾛ手続き

ﾏｸﾛ･ﾌﾟﾛｼｰｼﾞｬは次の形式で定義します。

 ■ MACRO文,ENDM文

mname MACRO {para{,para,…}}
     {LOCAL  name{,name,…}}
      …
     {EXITM}
      …
      ENDM
mnameはﾏｸﾛの名前で、MACROからENDMまでの文がﾏｸﾛの本体です。paraは、ﾏｸﾛの呼び出しで実引数に置き換えられるべきﾏｸﾛの本体に含まれるﾊﾟﾗﾒｰﾀを表します。これは、仮引数とも呼ばれ、複数を指定する場合は、,(ｶﾝﾏ)、ｽﾍﾟｰｽまたはﾀﾌﾞで区切ります。仮引数には、ｷｰﾜｰﾄﾞを使用できません。仮引数の属性として、次のような指定が可能です。
para: REQ
必須であることの指定
para: = <text>
省略時のﾃﾞﾌｫﾙﾄ値の指定
para: VARARG
個数が可変であることの指定(最後の引数のみ可)
ﾏｸﾛは、次の形式で呼び出します。
      mname {arg{,arg,…}}
mnameは定義済みのﾏｸﾛの名前で、これが記述されている位置に、定義されているﾏｸﾛが展開されます。argは実引数で、複数を指定する場合は、,(ｶﾝﾏ)、ｽﾍﾟｰｽまたはﾀﾌﾞで区切ります。これが指定されていると、定義時の対応する位置のparaに対応して、ﾏｸﾛの本体に含まれるparaがargで置き換えられます。次に使用例を示します。
ｿｰｽ･ﾌｧｲﾙでの定義
  ADD2 MACRO p1,p2,p3
  PUSH AX
  MOV  AX,p2
  ADD  AX,p3
  MOV  p1,AX
  POP  AX
  ENDM
ｿｰｽ･ﾌｧｲﾙでの参照 ｱｾﾝﾌﾞﾙ後の展開内容
  ADD2 total,data,DX
→
  PUSH AX

  MOV  AX,data

  ADD  AX,DX

  MOV  total,AX

  POP  AX
ﾏｸﾛ定義内で別の定義済みﾏｸﾛの呼び出しを含めること(ﾈｽﾄ)もできます。

 ■ PURGE文

 同一の名前で新しくﾏｸﾛを定義すると、以前に定義されているﾏｸﾛの内容は自動的に無効となり、新しい定義内容で置き換わります。単に、定義済みのﾏｸﾛを無効とする場合は、次の文で指定します。
      PURGE name{,name,…}
この結果、定義内容がﾒﾓﾘから削除されて、これ以降のﾏｸﾛの参照は無視され、呼び出されても何も展開されません。この文をﾏｸﾛ定義の最後に記述すると、自分自身を無効化できます。

 ■ LOCAL文

 ﾏｸﾛ内部だけで有効なｼﾝﾎﾞﾙを使用する場合は、MACRO文の直後に、次の形式で指定します。この指定は、ｼﾝﾎﾞﾙを含むﾏｸﾛの参照が複数回行なわれる場合に、ｼﾝﾎﾞﾙの二重定義を避けるために必要となります。
      LOCAL name{,name,…}
nameは、ﾏｸﾛ定義の内部だけで使用されるｼﾝﾎﾞﾙです。

 ■ GOTO文

 ﾏｸﾛでは、次の形式の分岐文が使用できます。
       …
       GOTO label
次に展開する位置を指定
       …
:label
ﾏｸﾛ内だけで有効なﾗﾍﾞﾙ
       …

■ EXITM文

 ﾏｸﾛの展開を、ENDM文よりも前の位置で終わらせるには、次の文を記述します。
      EXlTM
この結果、EXITM文からENDM文までに記述されている文は展開されません。ﾈｽﾄになっている場合は、現在のﾏｸﾛを終了して、すぐ外側のﾏｸﾛの展開に移ります。通常、この文は、条件付きｱｾﾝﾌﾞﾙの文と共に使用されます。


繰り返しﾏｸﾛ

6.2 繰り返しﾏｸﾛ

繰り返し処理を容易に記述できるようにするために、次表のﾌﾞﾛｯｸ･ﾏｸﾛが使用できます。繰り返されるﾌﾞﾛｯｸの終わりは、ENDM文で指定します。ﾏｸﾛとは異なり、定義は存在しませんが、L0CAL文、GOTO文やEXITM文も使用できます。
命令 意味
REPEAT
指定回数だけ、ﾌﾞﾛｯｸを繰り返す。
WHILE
条件式が真(0以外)の間は、ﾌﾞﾛｯｸを繰り返す。
FOR
順次、引数を置換してﾌﾞﾛｯｸを繰り返す。
FORC
順次、文字を置換してﾌﾞﾛｯｸを繰り返す。

■ REPEAT文

 指定回数だけ、ﾌﾞﾛｯｸを繰り返すためには、次のREPEAT文を使用します。
      REPEAT expr
      …
繰り返されるﾌﾞﾛｯｸ
      ENDM
exprは整数式で、評価結果の回数だけ、ENDM文までのﾌﾞﾛｯｸが繰り返されます。次に使用例を示します。
例:
  REPEAT 8
ENDMまでを8回繰り返す
  WORD   $
この位置のｱﾄﾞﾚｽを定義(設定)
  BYTE   24 DUP(?)
24ﾊﾞｲﾄの未初期化領域を確保
  ENDM

■ WHILE文

 指定の条件式が真の間、ﾌﾞﾛｯｸを繰り返すためには、次のWHILE文を使用します。
      WHILE expr
      …
繰り返されるﾌﾞﾛｯｸ
      ENDM
exprは整数式で、評価結果が偽(0)になるまで、ENDM文までのﾌﾞﾛｯｸが繰り返されます。次に使用例を示します。
例:
n =     10
  WHILE n
  WORD  n*2
20, 18, …2のﾜｰﾄﾞﾃﾞｰﾀの定義
n =     n-1
  ENDM

■ FOR文

 引数を置換しながら、ﾌﾞﾛｯｸを繰り返すためには、次のFOR文を使用します。
      FOR  para,<arg{,arg,…>}
      …
paraに順次argを代入して繰り返される部分
      ENDM
paraの属性として、次のような指定が可能です。
para:REQ
必須であることの指定
para:=value
省略時のﾃﾞﾌｫﾙﾄvalueの指定
ﾌﾞﾛｯｸに含まれるすべてのparaが、順次argで置き換えられて、ﾌﾞﾛｯｸが繰り返されます。ｽﾍﾟｰｽや区切り記号を含む文字列を指定する場合は、argを記号<>で囲みます。次に使用例を示します。
例:
  F0R  reg,< BX,CX,DX>
  ADD  AX,reg
  ENDM

■ FORC文

 1個の文字を置換しながら、ﾌﾞﾛｯｸを繰り返すには、次のFORC文を使用します。
      F0RC para,<text>
      …
textの先頭から1字ずつ代入して繰り返される部分
      …
      ENDM
ﾌﾞﾛｯｸに含まれるparaが、textの先頭文字から順次置き換えられて、ﾌﾞﾛｯｸが繰り返されます。次に使用例を示します。
例:
  F0RC ch,<0123456789abcdef>
16個のﾊﾞｲﾄﾃﾞｰﾀを生成
  BYTE '&ch'
&はﾏｸﾛ演算子
  ENDM


ﾏｸﾛ関数

6.3 ﾏｸﾛ関数

ﾏｸﾛ関数は常にﾃｷｽﾄを返します。これは、ﾏｸﾛ･ﾌﾟﾛｼｰｼﾞｬと類似の次の形式で定義し、GOTO文も使用できます。
mname MACRO {para{,para,…}}
     {LOCAL  name{,name,…}}
      …
      …
      EXITM  <text>
返す値(必須)
      ENDM
返す値は必要ならばﾏｸﾛ演算子の<>または%を用いてﾃｷｽﾄとします。定義を無効化するには、PURGE文で指定します。一度も呼び出されていない場合に限り、ﾏｸﾛ関数は再定義可能です。


ﾏｸﾛ演算子

6.4 ﾏｸﾛ演算子

ﾏｸﾛや繰り返しﾌﾞﾛｯｸ内では、通常の演算子以外に、次表に示すﾏｸﾛ演算子が使用できます。
演算子 名前 機能
<>
ﾘﾃﾗﾙ･ﾃｷｽﾄ演算子 文字列をﾘﾃﾗﾙとして扱う。
%
式演算子 (展開演算子) 式として評価する。
&
代入演算子 (置換演算子) 置換すべきﾊﾟﾗﾒｰﾀを指定する。
!
ﾘﾃﾗﾙ･ｷｬﾗｸﾀ演算子 文宇をﾘﾃﾗﾙとして扱う。
;;
ﾏｸﾛ･ｺﾒﾝﾄ ﾏｸﾛ定義内だけのｺﾒﾝﾄ。

■ ﾘﾃﾗﾙ･ﾃｷｽﾄ演算子 <>

ｽﾍﾟｰｽなどの区切り文字や特殊な文字を含む文字列を、1個のﾘﾃﾗﾙとして扱う場合は、次の形式のﾘﾃﾗﾙ･ﾃｷｽﾄ演算子を使用します。
<text>
記号<>で囲まれた内部のすべての文字列が、ﾘﾃﾗﾙ･ﾃｷｽﾄとなります。記号<>をﾃｷｽﾄ･ﾃﾞﾘﾐﾀと呼ぶ場合があります。

 ﾘﾃﾗﾙ･ﾃｷｽﾄ演算子が、ﾈｽﾄされたﾏｸﾛや繰り返しﾌﾞﾛｯｸで使用された場合、内部に含まれるﾏｸﾛや繰り返しﾌﾞﾛｯｸにﾊﾟﾗﾒｰﾀが渡されるたびに、ﾊﾟﾗﾒｰﾀの最も外側の<と>が取り除かれます。従って、場合によってはﾈｽﾄのﾚﾍﾞﾙに相当する複数の<と>が必要になります。次に使用例を示します。
例:
  MACRO1 AX,BX
ﾏｸﾛの引数は2個
  MACRO2 <AX,BX>
ﾏｸﾛの引数は1個の文字列

■ 式演算子 %

 文字列を、強制的に式として評価するためには、次の形式の式演算子を使用します。
%text
textを式として評価し、%textを結果の値または文字列で置き換えます。これに続くﾊﾟﾗﾒｰﾀが存在する場合、式として評価しないためには、区切りｺｰﾄﾞが必要です。ただし、式演算子が行頭に記述されている場合は、その行のﾃｷｽﾄ･ﾏｸﾛとﾏｸﾛ関数をすべて展開します。

 ■ 置換演算子 &

 次の形式で代入演算子が用いられていると、ﾊﾟﾗﾒｰﾀを対応する実引数で置き換えます。これは、置換すべきﾊﾟﾗﾒｰﾀが、他の文字列と結合される場合や、文字列定数に含まれている場合などに必要です。
&para&
なお、この記号を省略できる場合がありますが、注意が必要です。

 ■ ﾘﾃﾗﾙ･ﾁｬﾗｸﾀ演算子 !

 特殊な意味をもつ文字をﾘﾃﾗﾙとして取り扱う場合は、次の形式を使用します。
!c
cは&などの特殊な意味をもつ1個の文字で、その文字を単なる文字として取り扱います。

 ■ ﾏｸﾛ･ｺﾒﾝﾄ ;;

 ﾏｸﾛの定義時には表示されても、展開時に表示されないｺﾒﾝﾄを記述できます。通常の;(ｾﾐｺﾛﾝ)で始まる注釈は、ﾏｸﾛの展開で常に表示されますが、次の形式では展開時に表示されません。
;;comment
ﾏｸﾛ定義時だけのｺﾒﾝﾄ


ﾏｸﾛの特殊な定義

6.5 ﾏｸﾛの特殊な定義

ﾏｸﾛの特殊な用法を以下に示します。

 ■ ﾏｸﾛ定義のﾈｽﾄ

 ﾏｸﾛの中で、次のように別のﾏｸﾛを定義できます。この形式では、外側のﾏｸﾛが呼び出されて初めて内側のﾏｸﾛが定義されます。これにより、外側のﾏｸﾛの呼び出しで、ﾏｸﾛの名前も含めて、内側のﾏｸﾛの内容を呼出し時に定義することが可能です。
mname  MACRO {para{,para,…}}
       …
mname1 MACRO {para1{,para1,…}}
       …
       ENDM
       …
       ENDM

■ ﾏｸﾛの再帰呼び出し

 ﾏｸﾛ定義の中に、自分自身を呼出す文の記述も可能です。この形式では、必ず呼出しでの展開が終了する条件が必要です。
mname  MACRO {para{,para,…}}
       …
       mname {arg{,arg,…}}
       …
       ENDM

■ ﾏｸﾛ内での再定義

 ﾏｸﾛ定義の中に、自分自身を再定義する文の記述も可能です。再定義によって、以前の定義内容は新しい定義で置き換えられます。ただし、最初(外側)のﾏｸﾛのENDMと再定義(内側)のﾏｸﾛのENDMの間には、何も記述できません。
mname  MACRO {para{,para,…}}
       …
mname  MACRO {para{,para,…}}
       …
       ENDM
       ENDM


演算子

7. 演算子

ｵﾍﾟﾗﾝﾄﾞに対する各種の操作のために、演算子(operator)を使用できます。また、複数の演算子が使用されている場合、演算子の優先順位に従って評価されます。等しい優先順位の演算子では、単項演算子を除いて、左から右へ記述されている順に評価されます。この評価順位は、( )(括弧)で囲むことで変更可能です。次表に演算子と優先順位を示します。なお、通常の記述では、演算子の処理はｱｾﾝﾌﾞﾙ時に行なわれることに注意して下さい。以下は、演算子の分類別の概要です。
■ 演算子と優先順位
優先順位 演算子 意味 分類
1
( )
優先順位の変更
[  ]
ﾒﾓﾘ・ｵﾍﾟﾗﾝﾄﾞの間接あるいは加算 ｲﾝﾃﾞｯｸｽ演算子
2
SIZE0F
型/変数の総ﾊﾞｲﾄ数 型演算子
SlZE
変数の総ﾊﾞｲﾄ数
LENGTHOF
変数の要素数
LENGTH
変数の要素数
WlDTH
ﾚｺｰﾄﾞまたはﾌｨｰﾙﾄﾞのﾋﾞｯﾄ長 ﾚｺｰﾄﾞ演算子
MASK
ﾚｺｰﾄﾞまたはﾌｨｰﾙﾄﾞを取り出すﾏｽｸ
3
.
参照ﾌｨｰﾙﾄﾞの識別 構造体ﾌｨｰﾙﾄﾞ
4
:
ｾｸﾞﾒﾝﾄ・ﾚｼﾞｽﾀの変更 ｾｸﾞﾒﾝﾄ変更演算子
PTR
型の変更 型演算子
5
0FFSET
ｵﾌｾｯﾄ値
SEG
ｾｸﾞﾒﾝﾄ値
TYPE
型を表わす値
THIS
指定の型のｵﾍﾟﾗﾝﾄﾞ
LR0FFSET
実行時ﾛｰﾀﾞ解決ｵﾌｾｯﾄ
6
HlGH
上位ﾊﾞｲﾄ
L0W
下位ﾊﾞｲﾄ
HlGHW0RD
上位ﾜｰﾄﾞ
L0WWORD
下位ﾜｰﾄﾞ
7
+
正の符号(単項演算子) 算術演算子
-
負の符号(単項演算子)
8
*
乗算/ｽｹｰﾘﾝｸﾞ
/
除算
M0D
乗余(整数除算の余り)
SHL
左方向へｼﾌﾄ ｼﾌﾄ演算子
SHR
右方向へｼﾌﾄ
9
+
加算(2項演算子) 算術演算子
-
減算(2項演算子)
10
EQ
等しい(＝) 関係演算子
NE
等しくない(≠)
GE
大きいか等しい(≧)
GT
大きい(＞)
LE
小さいか等しい(≦)
LT
小さい(＜)
11
N0T
ﾋﾞｯﾄごとの論理否定 ﾋﾞｯﾄ論理演算子
12
AND
ﾋﾞｯﾄごとの論理積
13
0R
ﾋﾞｯﾄごとの論理和
X0R
ﾋﾞｯﾄごとの排他的論理和
14
SH0RT
shortに変更 型演算子
OPATTR
属性を表わす値
.TYPE
属性を表わす値

7.1 算術演算子
7.2 型演算子
7.3 構造体ﾌｨｰﾙﾄﾞ名演算子
7.4 ﾚｺｰﾄﾞ演算子
7.5 ｲﾝﾃﾞｯｸｽ演算子
7.6 ｼﾌﾄ演算子
7.7 ﾋﾞｯﾄ論理演算子
7.8 関係演算子


算術演算子

7.1 算術演算子

数値演算子の対象となる整数値は、常に33ﾋﾞｯﾄに拡張されて処理されます。算術演算子には、次表に示す種類があります。
■ 算術演算子
演算子 意味 形式
+
正の符号(単項演算子)
+expr
-
負の符号(単項演算子)
-expr
+
加算
expr+expr
-
減算
expr-expr
*
乗算
expr*expr
/
除算
expr/expr
MOD
剰余(整数除算の余り)
expr MOD expr
乗算の演算子は、80386ﾌｧﾐﾘ･ﾌﾟﾛｾｯｻでは、ｲﾝﾃﾞｯｸｽ･ﾚｼﾞｽﾀのｽｹｰﾘﾝｸﾞ(scaling)を表わすためにも使用します。
単項演算子の正符号は何も影響せず、通常は省略可能です。負符号は整数の場合、2の補数表示を結果とします。
四則演算と剰余は、整数に対して適用され、除算では小数点以下が切り捨てられます。


型演算子

7.2 型演算子

型に関連する演算子を次表に示します。以下は、各演算子の概要です。
■ 型演算子
演算子 意味
HIGH
式の評価結果の下位ﾜｰﾄﾞ値の上位ﾊﾞｲﾄを求める
HIGHWORD
式の評価結果のﾀﾞﾌﾞﾙﾜｰﾄﾞ値の上仕ﾜｰﾄﾞを求める
LENGTH
変数の要素数を求める
LOW
式の評価結果の下位ﾜｰﾄﾞ値の下位ﾊﾞｲﾄを求める
LOWWORD
式の評価結果のﾀﾞﾌﾞﾙﾜｰﾄﾞ値の下位ﾜｰﾄﾞを求める
LROFFSET
実行時ﾛｰﾀﾞ解決ｵﾌｾｯﾄを指定する
OFFSET
ｵﾌｾｯﾄ値を求める
OPATTR
現在の言語型とｵﾍﾟﾗﾝﾄﾞの属性を求める
PTR
変数またはﾗﾍﾞﾙの型を強制的に変更する
SEG
ｾｸﾞﾒﾝﾄ値を求める
SHORT
ﾗﾍﾞﾙの型をshortに変更する
SIZE
変数に割り当てられている総ﾊﾞｲﾄ数を求める
THIS
現在のﾛｹｰｼｮﾝ･ｶｳﾝﾀから指定の型のｵﾍﾟﾗﾝﾄﾞを生成する
TYPE
式の型を求める
.TYPE
式の属性を求める(0PATTR演算子参照)

■ HIGH演算子

 HIGH演算子は次の形式で使用します。
HIGH expr
式exprは評価結果が定数、またはEXTERN文で指定された外部ｼﾝﾎﾞﾙの場合は、ABS型かｼﾝﾎﾞﾙのｵﾌｾｯﾄでなければなりません。式の評価結果の下位ﾜｰﾄﾞ値の上位ﾊﾞｲﾄが求まります。

 ■ HIGHWORD演算子

 前記のHIGH演算子と同様に、ﾀﾞﾌﾞﾙﾜｰﾄﾞの上位ﾜｰﾄﾞを得るには、HIGHWORD演算子を次の形式で使用します。
HIGHWORD expr

■ LENGTH演算子

 LENGTH演算子は次の形式で使用します。
LENGTH name
変数nameの要素数が求まります。nameの定義でDUP演算子が使用されていれば、(ﾈｽﾄの場合は最も外側の)DUP演算子で指定されている繰り返し値が求まります。使用されていなければ、結果は1です。

 ■ LOW演算子

 LOW演算子は次の形式で使用します。
LOW expr
式exprは評価結果が定数、またはEXTERN文で指定された外部ｼﾝﾎﾞﾙの場合は、ABS型かｼﾝﾎﾞﾙのｵﾌｾｯﾄでなければなりません。式の評価結果の最下位ﾊﾞｲﾄが求まります。

 ■ L0WW0RD演算子

 前記のLOW演算子と同様に、ﾀﾞﾌﾞﾙﾜｰﾄﾞの下位ﾜｰﾄﾞを得るには、L0WW0RD演算子を次の形式で使用します。
LOWWORD expr

■ LROFFSET演算子

 LROFFSET演算子は次の形式で使用します。
LROFFSET expr
exprは変数かﾗﾍﾞﾙで、ｵﾌｾｯﾄとして評価可能な直接ﾒﾓﾘ参照ｵﾍﾟﾗﾝﾄﾞです。ﾌﾟﾛｸﾞﾗﾑ実行時のﾛｰﾀﾞによるｵﾌｾｯﾄの解決を指定します。

 ■ OFFSET演算子

 OFFSET演算子は次の形式で使用します。
OFFSET expr
式exprには、評価結果がｱﾄﾞﾚｽとなるものを指定し、ｱﾄﾞﾚｽのｵﾌｾｯﾄ値が求まります。簡略化ｾｸﾞﾒﾝﾄの場合で、nearﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ内で宣言されているものは、ｸﾞﾙｰﾌﾟDGROUPの先頭からのｵﾌｾｯﾄが求まります。これ以外では、属するｾｸﾞﾒﾝﾄの先頭からのｵﾌｾｯﾄが求まります。ｸﾞﾙｰﾌﾟとして宣言されているｾｸﾞﾒﾝﾄでは、ｾｸﾞﾒﾝﾄ変更演算子を用いれば、ｵﾌｾｯﾄの基準となる位置を、ｸﾞﾙｰﾌﾟの先頭または属するｾｸﾞﾒﾝﾄの先頭のいずれかに指定できます。

 ■ OPATTR演算子

 OPATTR演算子は次の形式で使用します。
0PATTR expr
現在の言語型とｵﾍﾟﾗﾝﾄﾞの属性が下図のﾜｰﾄﾞ値で得られます。上位ﾊﾞｲﾄは、exprが言語型の属性に関係する場合に設定されます。下位ﾊﾞｲﾄは.TYPE演算子で得られるものと同じです。不正なexprや前方参照に対しては0を結果とします。
■ OPATTR演算子の返す内容
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
予約済み |  |  |  |  | 言語型 |  |  | SB | SS | DF | RG | DA | CN | DT | CD
言語型 | 意味 | 略号 | 1の意味 | 0の意味
000 | なし | CD | ｺｰﾄﾞに関連する | ｺｰﾄﾞに関連しない
001 | C | DT | ﾃﾞｰﾀに関連する | ﾃﾞｰﾀに関連しない
010 | SYSCALL | CN | 定数 | 定数でない
011 | STDCALL | DA | 直接ｱﾄﾞﾚｽ | 直接ｱﾄﾞﾚｽ以外
100 | PASCAL | RG | ﾚｼﾞｽﾀ | ﾚｼﾞｽﾀ以外
101 | FORTRAN | DF | 定義済み | 未定義
110 | BASIC | SS | SS相対である | SS相対でない
111 | 予約済み | SB | 外部参照ｼﾝﾎﾞﾙ | 内部ｼﾝﾎﾞﾙ

■ PTR演算子

 PTR演算子は次の形式で使用します。
size PTR expr
type PTR expr
式exprを指定の属性sizeまたはtypeとして取り扱います。属性に関しては下表を参照して下さい。PTR演算子は、次のような場合に必要となります。また、PTR演算子はTYPEDEF文でも使用されます。
◆ | ｱｾﾝﾌﾞﾗのﾃﾞﾌｫﾙﾄの属性を変更する。
◆ | exprの属性を一時的に変更する。
◆ | exprだけでは決められない属性を確定する。
■ PTR、THIS演算子で指定する属性
種類 指定内容 属性
size
BYTE
ﾊﾞｲﾄ･ﾃﾞｰﾀ
SBYTE
符号付きﾊﾞｲﾄ･ﾃﾞｰﾀ
W0RD
ﾜｰﾄﾞ･ﾃﾞｰﾀ
SWORD
符号付きﾜｰﾄﾞ･ﾃﾞｰﾀ
DWORD
ﾀﾞﾌﾞﾙﾜｰﾄﾞ･ﾃﾞｰﾀ
SDW0RD
符号付きﾀﾞﾌﾞﾙﾜｰﾄﾞ･ﾃﾞｰﾀ
FWORD
farﾜｰﾄﾞ･ﾃﾞｰﾀ
QW0RD
ｸﾜｯﾄﾞﾜｰﾄﾞ･ﾃﾞｰﾀ
TBYTE
10ﾊﾞｲﾄ･ﾃﾞｰﾀ
REAL4
4ﾊﾞｲﾄ実数ﾃﾞｰﾀ
REAL8
8ﾊﾞｲﾄ実数ﾃﾞｰﾀ
REAL10
10ﾊﾞｲﾄ実数ﾃﾞｰﾀ
type
NEAR
NEAR16またはNEAR32(ｾｸﾞﾒﾝﾄ属性に依存)
FAR
FAR16またはFAR32(ｾｸﾞﾒﾝﾄ属性に依存)
NEAR16
16ﾋﾞｯﾄ属性のNEAR
FAR16
16ﾋﾞｯﾄ属性のFAR
NEAR32
32ﾋﾞｯﾄ属性のNEAR
FAR32
32ﾋﾞｯﾄ属性のFAR
PR0C
NEARまたはFARの手続き(ﾃﾞﾌｫﾙﾄのﾒﾓﾘ･ﾓﾃﾞﾙによる)

■ SEG演算子

 SEG演算子は次の形式で使用します。
SEG expr
式exprには、ﾗﾍﾞﾙ、変数、ｾｸﾞﾒﾝﾄ名、ｸﾞﾙｰﾌﾟ名、または評価結果がｱﾄﾞﾚｽとなるものを指定します。結果として、ｾｸﾞﾒﾝﾄの値が求まります。

 ■ SHORT演算子

 SHORT演算子は無条件分岐命令で、参照ﾗﾍﾞﾙlabelとの距離がshortであることを明示的に指定するために次の形式で使用します。
SH0RT label
通常は、ｱｾﾝﾌﾞﾗが自動的に判断して設定します。

 ■ SIZE演算子

 SIZE演算子は次の形式で使用します。
SIZE name
変数nameに割り当てられた領域のﾊﾞｲﾄ数の合計が求まります。

 ■ THIS演算子

 THIS演算子は次の形式で使用します。
THIS size
THIS type
sizeとtypeに関しては前表を参照して下さい。現在のﾛｹｰｼｮﾝ･ｶｳﾝﾀの値をもつ、指定された属性のｵﾍﾟﾗﾝﾄﾞを生成します。通常、EQU文または=で使用され、変数またはﾗﾍﾞﾙを定義します。

 ■ TYPE演算子

 TYPE演算子は次の形式で使用します。
TYPE expr
式exprの種類に応じて、次表に示す値が返されます。簡略化ｾｸﾞﾒﾝﾄでは、ﾒﾓﾘ･ﾓﾃﾞﾙに依存して手続きのﾗﾍﾞﾙがnearまたはfarになります。
■ TYPE演算子の結果
expr | 返される値
変数 | 変数の要素のｻｲｽﾞ(ﾊﾞｲﾄ数)。要素は、もし存在するならば最も外側のDUP演算子を取り除いた時に割り当てられるものを意味する。なお、文字列の場合は1を返す。
構造体 | 構造体に含まれる総ﾊﾞｲﾄ数。
共用体 | 共用体の最も長いﾌｨｰﾙﾄﾞのｻｲｽﾞ。
ﾚｺｰﾄﾞ | ﾚｺｰﾄﾞのｻｲｽﾞ。
ﾗﾍﾞﾙ | 距離を表わす属性(値)。
定数 | 0を返す。
ﾚｼﾞｽﾀ | ﾚｼﾞｽﾀのｻｲｽﾞを返す。

 次のように、TYPE演算子の返す値をPTR演算子で使用できます
例:
     …
     JMP   (TYPE label) PTR HERE
     …
     …
HERE LABEL PROC
     …

■ .TYPE演算子

 .TYPE演算子は、前ﾊﾞｰｼﾞｮﾝとの互換性のために使用可能な演算子で、次の形式で使用します。
.TYPE expr
式exprに応じて、OPATTR演算子で求まるﾜｰﾄﾞ値の下位ﾊﾞｲﾄの値が返されます。この演算子は、LOW OPATTR exprと等価です。


構造体ﾌｨｰﾙﾄﾞ名演算子

7.3 構造体ﾌｨｰﾙﾄﾞ名演算子

構造体または共用体のﾌｨｰﾙﾄﾞを参照する場合は、次の形式のように構造体ﾌｨｰﾙﾄﾞ名演算子の.(ﾋﾟﾘｵﾄﾞ)を使用します。
name field{.field…}
nameは定義で使用した名前または宣言名、fieldは宣言でのﾌｨｰﾙﾄﾞ名です。


ﾚｺｰﾄﾞ演算子

7.4 ﾚｺｰﾄﾞ演算子

ﾚｺｰﾄﾞの参照などに使用するﾚｺｰﾄﾞ演算子には、下表に示すものがあります。
 ■
ﾚｺｰﾄﾞ演算子
演算子 意味
MASK
対象のﾚｺｰﾄﾞまたは各ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞを取り出すために必要なﾋﾞｯﾄ位置が1の値をもつ定数を表わす。
WIDTH
ﾚｺｰﾄﾞまたは各ﾋﾞｯﾄ･ﾌｨｰﾙﾄﾞのﾋﾞｯﾄ長を表わす。


ｲﾝﾃﾞｯｸｽ演算子

7.5 ｲﾝﾃﾞｯｸｽ演算子

ﾒﾓﾘ･ｵﾍﾟﾗﾝﾄﾞの参照に使用されるｲﾝﾃﾞｯｸｽ演算子は、次の形式で使用され、間接あるいは加算の意味をもちます。
[expr] {[expr]…}
式exprは、ﾒﾓﾘの実効ｱﾄﾞﾚｽの計算に使用されるﾃﾞｨｽﾌﾟﾚｰｽﾒﾝﾄ、ﾍﾞｰｽ･ﾚｼﾞｽﾀ、ｲﾝﾃﾞｯｸｽ･ﾚｼﾞｽﾀまたは評価結果が定数となる式を、加算記号で結びつけたものです。たとえば、これらすべてが使用されている[ name + base + index + const ]の場合、次のいずれの形式とも等価です。
[ name + base + index ] + const
name [ base + index + const]
name [ base + index ] + const
name [ base ] [ index + const]
name [ base ] [ index ] + const
name [ base ] [ index ] . const
name + [ base ] [ index ] [ const ]
[ name ] [ base ] [ index ] [ const ]
各項目の順序にはとくに制限はありませんが、ﾚｼﾞｽﾀの間接指定では常に[ ]が必要です。
例:
  MOV AL,[EAX+EBX+BUFFER+10]


ｼﾌﾄ演算子

7.6 ｼﾌﾄ演算子

ｼﾌﾄ演算子には、下表に示す2種類があります。
■ ｼﾌﾄ演算子
演算子 意味
SHL
指定ﾋﾞｯﾄ数分、左方向へｼﾌﾄする。
SHR
指定ﾋﾞｯﾄ数分、右方向へｼﾌﾄする。
ｼﾌﾄ演算子は、次の形式で使用します。
expr SHL n
expr SHR n
式exprの評価結果を、nﾋﾞｯﾄ(nは正整数)だけ論理的にｼﾌﾄします。従ってｼﾌﾄによって空いた位置には値が0のﾋﾞｯﾄが補われ、溢れた値は捨てられます。


ﾋﾞｯﾄ論理演算子

7.7 ﾋﾞｯﾄ論理演算子

ﾋﾞｯﾄ論理演算子には、下表に示す4種類があります。
■ ﾋﾞｯﾄ論理演算子
演算子 意味
AND
対応するﾋﾞｯﾄごとに論理積をとる。
OR
するﾋﾞｯﾄごとに論理和をとる。
XOR
対応するﾋﾞｯﾄごとに排他的論理和をとる。
NOT
ﾋﾞｯﾄごとに論理否定をとる(ﾋﾞｯﾄを反転する)。
これらはすべて対応する位置のﾋﾞｯﾄごとに評価されます。形式を次に示します。
expr AND expr
expr OR  expr
expr X0R expr
     N0T expr


関係演算子

7.8 関係演算子

関係演算子Lopには、下表に示す6種類があります。
■ 関係演算子
Lop 条件 評価方法
EQ
＝ 等しい (equal) 符号付きの32ﾋﾞｯﾄ数値として評価
NE
≠ 等しくない (not equal)
GE
≧ 大きいか等しい (greater than or equal) 符号付きの33ﾋﾞｯﾄ数値として評価
GT
＞ 大きい (greater than)
LE
≦ 小さいか等しい (less than or equal)
LT
＜ 小さい (less than)
関係演算子Lopは次の形式で使用し、条件が満たされれば真(-1:すべてのﾋﾞｯﾄが1の値)、満たされなければ偽(0:すべてのﾋﾞｯﾄが0の値)を結果とします。
expr Lop expr


ｱｾﾝﾌﾞﾙの制御

8. ｱｾﾝﾌﾞﾙの制御

8.1 ｿｰｽ･ﾌｧｲﾙのｲﾝｸﾙｰﾄﾞ
8.2 条件付きｱｾﾝﾌﾞﾙ
8.3 条件付きｴﾗｰ
8.4 ﾘｽﾄ制御
8.5 命令生成ﾃﾞｨﾚｸﾃｨﾌﾞ
8.6 その他のｱｾﾝﾌﾞﾙ制御


ｿｰｽ･ﾌｧｲﾙのｲﾝｸﾙｰﾄﾞ

8.1 ｿｰｽ･ﾌｧｲﾙのｲﾝｸﾙｰﾄﾞ

ｱｾﾝﾌﾞﾙ時に別のｿｰｽ･ﾌｧｲﾙを指定位置に挿入できます。

 ■ INCLUDE文

 次の形式でINCLUDE文を記述します。
      INCLUDE <filename>
      INCLUDE filename
filenameで指定されたﾌｧｲﾙが入力されて、ｱｾﾝﾌﾞﾙされます。入力されるﾌｧｲﾙ中にINCLUDE文を使用すること(ﾈｽﾄ)も可能です。ﾌｧｲﾙ名に特殊な文字が含まれていなければ、記号< >は省略できます。

 filenameには、ﾄﾞﾗｲﾌﾞ名やﾊﾟｽ名を使用できます。ﾃﾞｨﾚｸﾄﾘの区切りには、\(円記号)だけでなく、/(ｽﾗｯｼｭ)も使用できます。ﾄﾞﾗｲﾌﾞ名やﾊﾟｽ名が指定されている完全ﾊﾟｽまたは絶対ﾊﾟｽの場合は、指定位置のﾃﾞｨﾚｸﾄﾘだけをﾌｧｲﾙの検索対象としますが、相対ﾊﾟｽまたはﾌｧｲﾙ名だけのときは、次の順序でﾃﾞｨﾚｸﾄﾘを順次検索します。
① | 現在のﾃﾞｨﾚｸﾄﾘ(INCLUDE文を含むﾌｧｲﾙのﾃﾞｨﾚｸﾄﾘ)
② | ｱｾﾝﾌﾞﾗ起動時ｵﾌﾟｼｮﾝ/Iの指定位置(複数の場合は指定順)
③ | 環境変数INCLUDEの指定位置(複数の場合は指定順)


条件付きｱｾﾝﾌﾞﾙ

8.2 条件付きｱｾﾝﾌﾞﾙ

ある条件に従って、一連の文のｱｾﾝﾌﾞﾙを制御できます。これは、次の形式で指定します。なお、条件指定でのｱｾﾝﾌﾞﾙの対象となる一連の文を、以下ではﾌﾞﾛｯｸと呼びます。また、条件式では、0は偽に、0以外は真に対応します。
  IF 条件式
  文
条件式=真でｱｾﾝﾌﾞﾙ
  …
  文
 {ELSE
  文
条件式=偽でｱｾﾝﾌﾞﾙ
  …
  文}
  ENDIF
IF文が満たされたときにｱｾﾝﾌﾞﾙされるﾌﾞﾛｯｸは、IF文からELSE文まで、あるいはELSE文がなければENDIF文までです。満たされなければ、このﾌﾞﾛｯｸはｱｾﾝﾌﾞﾙされません。

 IF文が満たされない場合、ELSE文があれば、ELSE文からENDIF文までのﾌﾞﾛｯｸがｱｾﾝﾌﾞﾙされます。

 IF文の種類を次表に示します。式exprには、前方参照を含められず、評価結果は定数でなければなりません。
■ lF文の種類
形式 条件
IF     expr
式exprの値がｾﾞﾛ(真)である。
IFE    expr
式exprの値がｾﾞﾛ(偽)である。
IFB    <para>
実引数paraがﾌﾞﾗﾝｸ(空白)である。
IFNB   <para>
実引数paraがﾌﾟﾗﾝｸ(空白)でない。
IFDEF  name
ｼﾝﾎﾞﾙnameが定義済みである。
IFNDEF name
ｼﾝﾎﾞﾙnameが未定義である。
IFDIF  <para1>,<para2>
2つの実引数が異なる(英字の大小を区別する)。
IFDIFI <para1>,<para2>
2つの実引数が異なる(英字の大小を区別しない)。
IFIDN  <para1>,<para2>
2つの実引数が同一(英宇の大小を区別する)。
IFIDNI <para1>,<para2>
2つの実引数が同一(英宇の大小を区別しない)。
ﾌﾞﾛｯｸには、更にIF文を含められます。ﾈｽﾄの場合のELSE文は、その直前のIF文に対応します。IF文のﾈｽﾄでは、ELSE文の直後にIF文が続く場合があります。このときは、次に示すようなELSEIF文を使用できます。
  IF 条件式
  文
IF文が満たされた時にｱｾﾝﾌﾞﾙ
  …
  文
  ELSElF 条件式
  文
ELSElF文が満たされた時にｱｾﾝﾌﾞﾙ
  …
  文
 {ELSEIF 条件式
  文
ELSEIF文が満たされた時にｱｾﾝﾌﾞﾙ
  …
  文}
 {ELSE
  文
いずれの条件も満たされない時にｱｾﾝﾌﾞﾙ
  …
  文}
  ENDIF
この形式では、IF文またはELSEIF文のいずれか先に条件を満たしたﾌﾞﾛｯｸがｱｾﾝﾌﾞﾙされるか、いずれも満たされなければ、最後のELSE文のﾌﾞﾛｯｸがｱｾﾝﾌﾞﾙされます。ELSEIF文の種類を次表に示します。
■ ELSElF文の種類
形式 条件
ELSEIF     expr
式exprの値がｾﾞﾛ(偽)である。
ELSEIFE    expr
式exprの値が非ｾﾞﾛ(真)である。
ELSEIFB    <para>
実引数paraがﾌﾞﾗﾝｸ(blank:空白)である。
ELSEIFNB   <para>
実引数paraがﾌﾞﾗﾝｸ(bIank:空白)でない。
ELSEIFDEF  name
ｼﾝﾎﾞﾙnameがすでに定義済みである。
ELSEIFNDEF name
ｼﾝﾎﾞﾙnameが木定義である。
ELSEIFDIF  <para1>,<para2>
2つの実引数が異なる(英字の大小を区別する)。
ELSEIFDIFI <para1>,<para2>
2つの実引数が異なる(英字の大小を区別しない)。
ELSEIFDN   <para1>,<para2>
2つの実引数が同一(英字の大小を区別する)。
ELSEIFDNI  <para1>,<para2>
2つの実引数が同一(英字の大小を区別しない)。


条件付きｴﾗｰ

8.3 条件付きｴﾗｰ

ﾕｰｻﾞが定義する構文検査などが、下表に示す条件付きｴﾗｰ文を使用すれば、強制的な重大ｴﾗｰとしてｴﾗｰ表示することができます。重大ｴﾗｰが発生すると、ｴﾗｰ･ﾒｯｾｰｼﾞが出力され、ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙは作成されません。

 ｴﾗｰ文では、画面に表示するﾒｯｾｰｼﾞを記述できます。ｵﾍﾟﾗﾝﾄﾞのない場合は、次のように指定します。
.ERR    <text>
ｴﾗｰ時にtextを表示
ｵﾍﾟﾗﾝﾄﾞをもつものは、最後にﾒｯｾｰｼﾞをｶﾝﾏで区切って、次のように指定します。
.ERRE   expr,<text>
■ 条件付きｴﾗｰ文の種類
形式 条件
.ERR
無条件。
.ERRE    expr
式exprの値がｾﾞﾛである。
.ERRNZ   expr
式exprの値がｾﾞﾛでない。
.ERRB    <para>
実引数paraがﾌﾞﾗﾝｸ(空白)である。
.ERRNB   <para>
実引数paraがﾌﾞﾗﾝｸ(空白)でない。
.ERRDEF  name
ｼﾝﾎﾞﾙnameが定義済みである。
.ERRNDEF name
ｼﾝﾎﾞﾙnameが未定義である。
.ERRDIF  <para1>,<para2>
2つの実引数が異なる(英宇の大小を区別する)。
.ERRDIFI <para1>,<para2>
2つの実引数が異なる(英字の大小を区別しない)。
.ERRIDN  <para1>,<para2>
2つの実引数が同一(英宇の大小を区別する)。
.ERRIDNI <para1>,<para2>
2つの実引数が同一(英宇の大小を区別しない)。


ﾘｽﾄ制御

8.4 ﾘｽﾄ制御

ｱｾﾝﾌﾞﾙ時に作成可能なﾘｽﾄ･ﾌｧｲﾙに対して、次表に示す制御文が使用できます。.CREFと.NOCREFは、ﾘｽﾄ･ﾌｧｲﾙの最後に含まれるｼﾝﾎﾞﾙ･ﾃｰﾌﾞﾙと、ｿｰｽ･ﾌﾞﾗｳｻﾞ･ﾃﾞｰﾀﾍﾞｰｽの内容に影響します。
■ ﾘｽﾄ･ﾌｧｲﾙに対するﾘｽﾄ制御
形式 意味
TITLE <text>
各ﾍﾟｰｼﾞの2行目のﾀｲﾄﾙ(最大60文字)を指定。初期値は空白。
SUBTITLE <text>
各ﾍﾟｰｼﾞの3行目のﾀｲﾄﾙ(最大60文字)を指定。複数回の使用が可能。初期値は空白。
PAGE
改ﾍﾟｰｼﾞを行ない、1行目に日付と時刻を、2行目にはﾀｲﾄﾙとﾍﾟｰｼﾞ番号、3行目にはｻﾌﾞﾀｲﾄﾙを出力。PAGE文はﾍﾟｰｼﾞで最初に出力される文となる。ﾍﾟｰｼﾞ番号はPage s-nの形式で、s=ｾｸｼｮﾝ番号、n=ｾｸｼｮﾝ内ﾍﾟｰｼﾞ番号、初期値は共に1で、nは改ﾍﾟｰｼﾞで自動増加。
PAGE+
ﾍﾟｰｼﾞ番号のｾｸｼｮﾝ番号を+1し、ﾍﾟｰｼﾞを1に設定。これ以外はPAGEの指定と同一。
PAGE s-p
改ﾍﾟｰｼﾞして、ｾｸｼｮﾝ番号とﾍﾟｰｼﾞ番号を設定(変更)。
PAGE {length}{,width}
行数/1ﾍﾟｰｼﾞlength(0～255)と文宇数/1行width(60～132)を変更する。[ﾃﾞﾌｫﾙﾄは共に0]
.LIST
これ以降、この文も含め、ｿｰｽ･ﾌｧｲﾙに含まれる文を出力。[ﾃﾞﾌｫﾙﾄ]
.LISTALL
.LIST, .LlSTIF, .LlSTMACROALLを同時に指定した場合と同じ。
.NOLIST
これ以降、この文も含め、ｿｰｽ･ﾌｧｲﾙに含まれる文をﾘｽﾄに出力しない。
.LISTMACRO
これ以降、ｺｰﾄﾞが生成された部分のﾏｸﾛ展開をﾘｽﾄに出力。[ﾃﾞﾌｫﾙﾄ]
.LISTMACROALL
これ以降、ﾏｸﾛをすべてﾘｽﾄに出力。
.NOLISTMACRO
これ以降、ﾏｸﾛ展開をﾘｽﾄに出力しない。
.LISTIF
これ以降、条件付きｱｾﾝﾌﾞﾙで、偽でｱｾﾝﾌﾞﾙされないﾌﾞﾛｯｸをﾘｽﾄに出力。
.NOLISTIF
これ以降、条件付きｱｾﾝﾌﾞﾙで、偽でｱｾﾝﾌﾞﾙされないﾌﾞﾛｯｸをﾘｽﾄに出力しない。[ﾃﾞﾌｫﾙﾄ]
.TFCOND
これ以降、条件付きｱｾﾝﾌﾞﾙで、偽でｱｾﾝﾌﾞﾙされないﾌﾞﾛｯｸのﾘｽﾄの有無(/Sxまたは.LlSTIFと.N0LlSTlFの指定)を、この文が出現するたびに反転。
ｱｾﾝﾌﾞﾙ時のｵﾌﾟｼｮﾝ/sx指定 | あり | なし
最初の.TFCOND以降 | 出力しない | 出力する
次の.TFC0ND以降 | 出力する | 出力しない
(以後、交互に繰り返す)
.CREF
これ以降、すぺてのｼﾝﾎﾞﾙの情報を出力する。[ﾃﾞﾌｫﾙﾄ]
.NOCREF
これ以降、すべてのｼﾝﾎﾞﾙの情報を出力しない。
.NOCREF name {,name,…}
これ以降、指定ｼﾝﾎﾞﾙの情報を出力しない。


命令生成ﾃﾞｨﾚｸﾃｨﾌﾞ

8.5 命令生成ﾃﾞｨﾚｸﾃｨﾌﾞ

命令処理の効率的な記述のために、次表に示すC言語に類似の命令生成ﾃﾞｨﾚｸﾃｨﾌﾞが利用できます。これは、必要に応じてｱｾﾝﾌﾞﾗが命令ｺｰﾄﾞを生成します。なお、これらはﾈｽﾄにすることが可能です。
■ 命令生成ﾃﾞｨﾚｸﾃｨﾌﾞ
分類 命令生成ﾃﾞｨﾚｸﾃｨﾌﾞ 備考
条件判断制御
.IF        条件式
.ELSEIF    条件式
.ELSE
.ENDIF
ﾙｰﾌﾟ制御
.WHILE     条件式
.ENDW
.REPEAT
.UNTlL     条件式
.REPEAT
.UNTlLCXZ {条件式}
.BREAK    {.IF条件式}
ﾙｰﾌﾟ処理を抜け出す
.C0NTlNUE {.lF条件式}
次のﾙｰﾌﾟ処理に移る
条件式は、C言語と同じく、0以外は真、0は偽となります。このとき、整数の大小比較での符号には注意が必要です。明示的に指定するには、PTR演算子を用いてください。これらの制御文での条件式には、次表のC言語に類似の演算子とﾌﾗｸﾞ指定を使用できます。
■ 命令生成ﾃﾞｨﾚｸﾃｨﾌﾞで用いる演算子
演算子 形式 意味
==
expr1 == expr2 expr1とexpr2が等しい
!=
expr1 != expr2 expr1とexpr2が等しくない
>
expr1 > expr2 expr1がexpr2よりも大きい
>=
expr1 >= expr2 expr1がexpr2よりも大きいか等しい
<
exprl < expr2 expr1かeXpr2よも小さい
<=
expr1 <= expr2 expr1がexpr2よりも小さいか等しい
&
(expr1) & expr2 expr1とexpr2のﾋﾞｯﾄ論理積(ﾋﾞｯﾄ･ﾃｽﾄ)
!
!expr exprの論理否定
&&
expr1 && expr2 expr1とexpr2の論理積
||
expr1 || expr2 expr1とexpr2の論理和
ZER0?
ZFﾌﾗｸﾞが1
CARRY?
CFﾌﾗｸﾞが1
0VERFL0W?
0Fﾌﾗｸﾞが1
SlGN?
SFﾌﾗｸﾞが1
PARlTY?
PFﾌﾗｸﾞが1
ﾋﾞｯﾄ･ﾃｽﾄ演算子&は、置換演算子と誤解されなければ、ｵﾍﾟﾗﾝﾄﾞの括弧( )は省略可

■ .IF文

 .IF文は条件付き処理に使用し、実行時に条件を判断して、いずれかの処理ﾌﾞﾛｯｸを実行する最適なｺｰﾄﾞを生成するために用いられます。次に一般形を示します。
   .IF     条件式1
  文
条件式1成立時に実行する部分
  …
 {.ELSEIF  条件式2
  文
条件式2成立時に実行する部分
  …}
 {.ELSE
  文
いずれの条件も不成立時に実行する部分
  …}
  .ENDIF
次に具体例を示します。
例:
  .IF  !((var)&(2)) || ax==0
  …
TEST var,2の結果が 0 または AX が 0 の時に実行
  .ELSE
  …
  .ENDIF

■ .WHlLE文

 .WHlLE文はﾙｰﾌﾟ制御に使用し、繰り返し処理前に条件判断が行われ、条件式が真の間は繰り返されます。このために一度も繰り返されない場合が存在します。次に一般形を示します。
  .WHILE  条件式
  文
条件式が成立している間は実行する部分
  …
  .ENDW

■ .REPEAT文

 .REPEAT文は.WHILE文同様ﾙｰﾌﾟ制御に使用しますが、繰り返し処理後に条件を判断するので、最低一回は繰り返し処理を行います。次に一般形を示します。
  .REPEAT
  文
繰り返し実行する部分
  …
  .UNTIL  条件式
また、CXﾚｼﾞｽﾀを用いた繰り返しでは、次の形式が使用できます。この形式では、.REPEAT文以前に最大繰り返し回数をCXﾚｼﾞｽﾀに設定しておきます。条件式には==または!=が指定可能で、条件式省略時は単純にLOOP命令を生成します。
  .REPEAT
  文
繰り返し実行する部分
  …
  .UNTILCXZ {条件式}

■ .BREAK文,.CONTINUE文

ﾙｰﾌﾟ制御で、.BREAK文は繰り返しの終了、.CONTINUE文は、残りの実行文をｽｷｯﾌﾟすることができます。どちらの文でも、.IF条件式が指定されていれば、条件式が成立時にのみ、有効となります。
  .BREAK    {.lF条件式}
ﾙｰﾌﾟ処理を抜け出す
  .CONTINUE {.IF条件式}
次のﾙｰﾌﾟ処理に移る


その他のｱｾﾝﾌﾞﾙ制御

8.6 その他のｱｾﾝﾌﾞﾙ制御

分類に属さないその他のｱｾﾝﾌﾞﾙ制御を以下に示します。

 ■ ECHO文

 ECHO文を使用すると、ｱｾﾝﾌﾞﾙ時に、ｺﾝｿｰﾙである標準出力装置に文字列を表示できます。ｱｾﾝﾌﾞﾙ時にこの文に出会う(この文がｱｾﾝﾌﾞﾙの対象となる)と、文字列textが表示されます。text中にﾏｸﾛなどを含む場合、展開結果を表示するには、行の最初に%を記述する必要があります。次に一般形を示します。
      ECHO <text>
textを表示

■ INCLUDELIB文

 INCLUDELIB文は、ﾘﾝｸ時に必要なﾗｲﾌﾞﾗﾘ(library)名を、ｿｰｽ･ﾌｧｲﾙで指定できます。filenameは、ﾗｲﾌﾞﾗﾘのﾌｧｲﾙ名で、拡張子を省略した場合は.LIBが仮定されます。ﾌｧｲﾙ名に特殊な文字が含まれていなければ、記号<>は省略できます。このﾗｲﾌﾞﾗﾘは、ﾘﾝｸ時に特定の順序で検索されます。次に一般形を示します。
      INCLUDELIB <filename>

■ ASSUME文

 ASSUME文を用いると、特定のﾚｼﾞｽﾀの使用法を限定できます。ﾚｼﾞｽﾀの使用でｵﾍﾟﾗﾝﾄﾞからｻｲｽﾞが確定できない場合、PTR演算子による明示的なｻｲｽﾞの指定が必要です。しかし、次の形式を使用し、typeでﾚｼﾞｽﾀのﾃﾞﾌｫﾙﾄ型を定義すれば不要となります。なお、ｾｸﾞﾒﾝﾄ･ﾚｼﾞｽﾀの指定で用いるASSUME文との関連に注意が必要です。
      ASSUME reg:type
同様に、ﾚｼﾞｽﾀの使用を抑制するには、次の形式を用います。
      ASSUME reg:ERROR
また、以前の定義を取り消す場合は、次のように指定します。
      ASSUME reg:NOTHING

■ PUSHCONTEXT文

 PUSHCONTEXT文を用いると、ｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙ内等で、現在のｱｾﾝﾌﾞﾙに関する状況の一部を一時的に保存して変更ができます。次に保存する場合の一般形を示します。
      PUSHCONTEXT {ASSUMES} {,RADIX} {,LISTING} {,CPU}
ASSUMESはASSUME文によるﾚｼﾞｽﾀの仮定、RADIXは.RADIX文によるﾃﾞﾌｫﾙﾄの基数、LISTINGはﾘｽﾃｨﾝｸﾞとｸﾛｽ･ﾘﾌｧﾚﾝｽに関する設定、CPUはﾏｲｸﾛﾌﾟﾛｾｯｻと数値演算ﾌﾟﾛｾｯｻの指定を意味します。これらすべてを保存する場合は、次のようにALLを指定します。
      PUSHCONTEXT ALL

■ POPCONTEXT文

 POPCONTEXT文は、PUSHCONTEXT文で保存された内容を復元します。ただし、保存と復元での指定内容は対応している必要があります。この2つの文は対で使用し、最大10ﾚﾍﾞﾙまでﾈｽﾄが可能です。次に一般形を示します。
      P0PC0NTEXT {ASSUMES} {,RADIX} {,LISTING} {,CPU}
すべてを復元する場合の形式を次に示します。
      P0PC0NTEXT ALL


ﾓｼﾞｭｰﾙ間の参照と共有変数

9. ﾓｼﾞｭｰﾙ間の参照と共有変数

ﾌﾟﾛｸﾞﾗﾑが1個のｿｰｽ･ﾌｧｲﾙだけで構成される場合は、とくに意識する必要はありませんが、ｿｰｽ･ﾌｧｲﾙが大きくなって分割した場合や、すでに作成済みのﾓｼﾞｭｰﾙを利用する場合は、ﾘﾝｸ時に必要な情報を指定する必要があります。

9.1 ｼﾝﾎﾞﾙの参照
9.2 共有変数


ｼﾝﾎﾞﾙの参照

9.1 ｼﾝﾎﾞﾙの参照

他のｿｰｽ･ﾌｧｲﾙに含まれるｾｸﾞﾒﾝﾄは、ｾｸﾞﾒﾝﾄ属性の指定に従って、ﾘﾝｸ時にｾｸﾞﾒﾝﾄ相互の配置が決定されます。連続して配置される同種のｾｸﾞﾒﾝﾄであっても、他のｿｰｽ･ﾌｧｲﾙに含まれるｾｸﾞﾒﾝﾄのﾗﾍﾞﾙや変数名は、そのままでは参照できません。すなわち、特別な場合を除いて、ｿｰｽ･ﾌｧｲﾙ単位でｼﾝﾎﾞﾙは局所性(ﾛｰｶﾙ)をもちます。通常は、以下に示す手順が必要です。なお、自動的に複数のｿｰｽ･ﾌｧｲﾙで参照可能なように指定される場合が存在します。COMM文と.MODEL文を参照してください。

 ■ PUBLIC文,EXTERN文

① 他のｿｰｽ･ﾌｧｲﾙから参照される可能性のあるものは、PUBLIC文でﾊﾟﾌﾞﾘｯｸ宣言します。
      PUBLIC {言語型}name{,{言語型}name,…}
nameは、PUBLIC文が記述されているｿｰｽ･ﾌｧｲﾙで定義されているﾗﾍﾞﾙ、変数名、または整数値を表わす等価記号の名前です。この文の宣言位置は、END文よりも前ならばとくに制限はありません。
② 他のｿｰｽ･ﾌｧｲﾙでﾊﾟﾌﾞﾘｯｸ宣言された名前を参照するｿｰｽ･ﾌｧｲﾙでは、EXTERN文で宣言します。
      EXTERN {言語型}name:type{,{言語型}name:type,…}
nameは他のｿｰｽ･ﾌｧｲﾙでﾊﾟﾌﾞﾘｯｸ宣言されている名前です。言語型は、ﾃﾞﾌｫﾙﾄの言語型を変更する場合に必要に応じて指定します。typeには、次表に示されているnameの属性のいずれかを指定します。PROCの指定では、NEARまたはFARが仮定され、完全なｾｸﾞﾒﾝﾄ記述では、ﾃﾞﾌｫﾙﾄはNEARですが、簡略化ｾｸﾞﾒﾝﾄではﾒﾓﾘ･ﾓﾃﾞﾙに依存して決まります。
■ EXTERN文での属性の指定
type 参照する側 参照される側
NEAR
NEARのﾗﾍﾞﾙ NEARのﾗﾍﾞﾙまたは手続き
FAR
FARのﾗﾍﾞﾙ FARのﾗﾍﾞﾙまたは手続き
PROC
NEARまたはFARの手続き NEARまたはFARのﾗﾍﾞﾙまたは手続き
BYTE
指定ｻｲｽﾞのﾃﾞｰﾀ 指定ｻｲｽﾞのﾃﾞｰﾀ
WORD
DWORD
FWORD
QWORD
TBYTE
REAL4
REAL8
REAL10
ABS
整数型定数 EQUまたは=で宣言
EXTERN文の記述位置は、参照側でのその属性をｱｾﾝﾌﾞﾙ時に確定するために、以下の規則に従う必要があります。
◆ | nearのﾗﾍﾞﾙ(ｺｰﾄﾞ)は、それを参照する(参照されるﾗﾍﾞﾙと同じ)ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄの内部で宣言する。
◆ | farのﾗﾍﾞﾙ(ｺｰﾄﾞ)の宣言位置は任意。
◆ | 変数は、属するｾｸﾞﾒﾝﾄを明確にするために、定義されているｾｸﾞﾒﾝﾄの中で宣言する。この場合、必要ならばﾀﾞﾐｰのﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄを用いる。
◆ | ABS指定の絶対ｼﾝﾎﾞﾙの宣言位置は任意。
EXTERNの特殊な使用法として、別名の宣言があります。
      EXTERN {言語型}name(xname):type
この場合、ﾘﾝｸ時の現ﾓｼﾞｭｰﾙでのnameの外部参照の解決で、他の条件からnameを含むﾓｼﾞｭｰﾙが結合されなければ、その代わりにxnameを用います。これにより、nameの定義を含むﾓｼﾞｭｰﾙの結合を省略できる場合が生じ、実行形式ﾌｧｲﾙのｻｲｽﾞを縮小できます。

 ■ EXTRNDEF文

 PUBLIC文とEXTERN文の使用を効率的なものとするために、次の形式のEXTRNDEF文が使用できます。
      EXTERNDEF {言語型}name:type{,{言語型}name:type,…}
この文を用いると、現ﾓｼﾞｭｰﾙ中でnameが定義されていればPUBLIC文として機能し、参照されていればEXTERN文として機能し、自動的にｼﾝﾎﾞﾙが処理されます。ただし、nameが定義も参照もされていなければ、この文での指定は無視されます。PROTO文で指定されている手続き名に対しては、自動的にEXTERNDEF文が生成されます。
ｿｰｽ･ﾌｧｲﾙ1 (全体の流れを記述)
       .MODEL   SMALL
ｽﾓｰﾙ･ﾒﾓﾘﾓﾃﾞﾙで簡略化ｾｸﾞﾒﾝﾄ定義
       .DATA
ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄ定義
MSG    BYTE     "This is a sample program."
       BYTE     0DH,0AH
       BYTE     0
ﾒｯｾ-ｼﾞの最後
       .STACK
ｽﾀｯｸ･ｾｸﾞﾒﾝﾄ定義
       .CODE
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄ定義
       EXTERN   MSGOUT:NEAR
外部参照ｼﾝﾎﾞﾙの定義
       .STARTUP
ﾌﾟﾛｸﾞﾗﾑ開始処理
       MOV      SI,OFFSET MSG
       CALL     MSGOUT
ｿｰｽ･ﾌｧｲﾙ2のﾙｰﾁﾝ呼び出し
       .EXIT     0
ﾌﾟﾛｸﾞﾗﾑ終了処理
       END
ｿ-ｽ･ﾌｧｲﾙ2 (文字列表示ﾙｰﾁﾝを記述)
       .MODEL   SMALL
       PUBLIC   MSGOUT
ﾊﾟﾌﾞﾘｯｸの宣言
       .CODE
MSGOUT PROC
手続きMSGOUTの開始
       MOV      DL,[SI]
       OR       DL,DL
       JZ       MOUT1
       MOV      AH,02H
       INT      21H
       INC      SI
       JMP      MSGOUT
MOUT1: RET
MSGOUT ENDP
手続きMSGOUTの終了
       END


共有変数

9.2 共有変数

ﾃﾞｰﾀで初期値を指定しないものは、C言語の共有変数と互換性のある共通の変数として領域を確保し、複数のｿｰｽ･ﾌｧｲﾙから参照できます。

 ■ COMM文

 これは、次のCOMM文で宣言し、通常はｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙとして、参照するすべてのﾌｧｲﾙに含めます。
      COMM {言語型} {type} name:size{:n}{,…}
typeはNEARまたはFARで、省略時のﾃﾞﾌｫﾙﾄは、完全なｾｸﾞﾒﾝﾄ定義ではNEAR、簡略化ｾｸﾞﾒﾝﾄではﾒﾓﾘ･ﾓﾃﾞﾙに依存して決まります。nameは変数名です。sizeは、BYTE, W0RD,などの型指定子または定義済みの構造体名のいずれかです。nは要素数で、省略時は1が仮定されます。sizeとnとから、全体の領域の大きさが決まります。

 共有変数の宣言では、以下の制約があります。
◆ COMM文の記述位置は、EXTERN文と同じ規則に従い、ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄの内部でなければならない。従って、必要ならばﾀﾞﾐｰのﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄを用いる。
◆ 共有変数として宣言された変数名が、いずれかのｿｰｽ･ﾌｧｲﾙのPUBLIC文で宣言されていると、COMM文はEXTERN文として処理される。
◆ 共有変数のﾒﾓﾘへの割り当てでは、複数の共有変数の相対的な位置を仮定できない。また、次の規則で自動的に割り当てられるｾｸﾞﾒﾝﾄは変更できない。
■ near型共有変数
簡略化ｾｸﾞﾒﾝﾄでは、DGROUPに含まれるｾｸﾞﾒﾝﾄc_commonに配置されます。完全なｾｸﾞﾒﾝﾄ定義では、DGROUPを定義し、これに含まれるものとして取り扱う必要があります。
■ far型共有変数
結合型はPRIVATE、ｸﾗｽ名は'FAR_BSS'のｾｸﾞﾒﾝﾄFAR_BSSに配置されます。従って、同じ名前をもつ複数のｾｸﾞﾒﾝﾄが存在することになるので、SEG演算子をfar型共有変数に用いて、ｾｸﾞﾒﾝﾄを求める必要があります。


OPTION文

10. OPTION文

ｿｰｽ･ﾌｧｲﾙ中で、次の形式を用いてｱｾﾝﾌﾞﾗに対する指示を記述できます。
      0PTI0N option{:para}{,…}
option:paraの内容を下表に示します。この指示は、記述位置から有効になります。なお、次の点に注意してください。
◆ | 0PTION文は、起動時ｵﾌﾟｼｮﾝ指定よりも優先します。
◆ | 記述位置が限定されている(一度だけ記述できる)ものがあります。
■ 0PTI0N文の指定内容
OPTIONの形式 | 指定内容 | ﾃﾞﾌｫﾙﾄ
M510指定無 | M510指定有
内部ｼﾝﾎﾞﾙの英字の大小区別 (言語型指定の方が優先)
CASEMAP:NOTPUBLIC
ｸﾞﾛｰﾊﾞﾙ識別子だけ大小を区別 (起動時ｵﾌﾟｼｮﾝ/Cxと同等) ○

CASEMAP:ALL
すべての識別子で大文字に変換 (起動時ｵﾌﾟｼｮﾝ/Cuと同等)
○
CASEMAP:NONE
すべての識別子で大小を区別 (起動時ｵﾌﾟｼｮﾝ/Cpと同等)
識別子の先頭でのﾄﾞｯﾄ(.)の使用
NOD0TNAME
使用不可とする ○

DOTNAME
使用可能にする
○
生成する浮動小数点命令の形式
N0EMULATOR
数値演算ﾌﾞﾛｾｯｻの実行命令 ○ ○
EMULATOR
ｴﾐｭﾚｰﾀ･ｺｰﾄﾞを生成 (起動時ｵﾌﾟｼｮﾝ/FPiと同等)
RETまたはlRETの命令に対するｴﾋﾟﾛｰｸﾞ生成ﾏｸﾛの登録 (RETまたはlRETの命令以外か、ｵﾍﾟﾗﾝﾄﾞをもつ場合は生成しない。)
EPlLOGUE:EpiIogueDef
ﾃﾞﾌｫﾙﾄのｴﾋﾟﾛｰｸﾞを登録 ○ ○
EPlLOGUE:macro
指定のﾏｸﾛを登録

EPILOGUE:NONE
ｺｰﾄﾞを生成しない
定数式でのﾜｰﾄﾞ･ｻｲｽﾞ [△: ﾏｲｸﾛﾌﾟﾛｾｯｻ指定に依存]
EXPR32
32ﾋﾞｯﾄの指定 ○ △
EXPR16
16ﾋﾞｯﾄの指定
△
ﾃﾞﾌｫﾙﾄの言語型の指定 (.M0DEL文と同等で、ﾃﾞﾌｫﾙﾄはなし。)
LANGUAGE:C
C言語 (起動時ｵﾌﾟｼｮﾝ/Gdと同等)

LANGUAGE:SYSCALL
(.M0DEL文参照)

LANGUAGE:STDCALL
(.M0DEL文参照)

LANGUAGE:BASIC
BASlC言語 (PASCALと同等)

LANGUAGE:FORTRAN
FORTRAN言語 (PASCALと同等)

LANGUAGE:PASCAL
PASCAL言語 (起動時ｵﾌﾟｼｮﾝ/Gcと同等)
条件付き分岐命令の距離の自動調整 (調整時はA6003の警告文を表示)
LJMP
ｺｰﾄﾞを追加して調整する ○ ○
NOLJMP
調整しない
MASM5.10に対する互換性
NOM510
互換性を考慮しない ○

M510
現在選択中のCPUで使用できない予約語は予約語として機能しない。
0PTI0N文の一部設定を次のように変更。
CASEMAP:ALL
D0TNAME
0LDMACROS
OLDSTRUCTS
80286以下のCPUが選択されている場合
EXPR16
MODEL文で言語が指定されている場合
PR0C:PUBLlC
SC0PED
.M0DEL文が記述されていない場合
0FFSET:SEGMENT
(起動時ｵﾌﾟｼｮﾝ/Zmと同等)
○
予約語とLての機能 (ﾘﾃﾗﾙ演算子と定義済みｼﾝﾎﾞﾙを除く)
N0KEYW0RD:<keyword {keyword...}>
指定ｷｰﾜｰﾄﾞを無効にする
論理演算(AND,0R,X0R)命令での符号拡張 (ﾃﾞﾌｫﾙﾄでは拡張する)
N0SIGNEXTEND
非符号拡張とする
演算子0FFSETの返す値 [△: .MODEL文の指定の有無に依存]
0FFSET:GROUP
ｸﾞﾙｰﾌﾟ相対 ○ △
0FFSET:SEGMENT
ｾｸﾞﾒﾝﾄ相対
△
0FFSET:FLAT
FLATｸﾞﾙｰﾌﾟに相対
ﾏｸﾛとﾊﾟﾗﾒｰﾀの代入方法
N0OLDMACR0S
新しい仕様を用いる ○

0LDMACROS
MASM5.1との互換性を維持する
○
構造体のﾒﾝﾊﾞの通用範囲
NO0LDSTRUCTS
新しい仕様を用いる (ﾄﾞｯﾄは構造体ﾌｨｰﾙﾄﾞ演算子) ○

OLDSTRUCTS
MASM5.1との互換性を維持する(構造体ﾒﾝﾊﾞは構造体名と同じ通用範囲となる。ﾄﾞｯﾄ演算子は加算の意味をもつようになる。)
○
ﾌﾟﾛｼｰｼﾞｬ(手続き)のﾃﾞﾌｫﾙﾄの可視性 [△: 言語型の指定の有無に依存]
PR0C:PUBLIC
他のﾓｼﾞｭｰﾙからの参照が可能 ○ △
PROC:PRIVATE
他のﾓｼﾞｭｰﾙからの参照は不可能
△
PR0C:EXPORT
ｴｷｽﾎﾟｰﾄの指定(0S/2)
ﾌﾟﾛﾛｰｸﾞ生成ﾏｸﾛの登録
PR0LOGUE:PrologueDef
ﾃﾞﾌｫﾙﾄのﾌﾟﾛﾛｰｸﾞを登録 ○ ○
PR0LOGUE:macro
指定のﾏｸﾛを登録

PROL0GUE:N0NE
ｺｰﾄﾞを生成しない
ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄの属性
N0READONLY
書き込みと読み出し可能 ○ ○
READONLY
読み出し専用
ﾌﾟﾛｼｰｼﾞｬ内のﾗﾍﾞﾙ(label:)のｽｺｰﾌﾟ [△: .MODELの指定の有無に依存]
SCOPED
ﾛｰｶﾙに指定 ○ △
NOSC0PED
ｸﾞﾛｰﾊﾞﾙに指定
△
ｾｸﾞﾒﾝﾄ･ｻｲｽﾞ (他の文での指定よりも優先する)
[△: 80386以上のCPU指定ではUSE32、ﾒﾓﾘ･ﾓﾃﾞﾙのFLAT指定ではFLAT、それ以外ではUSE16]
SEGMENT:USE16
16ﾋﾞｯﾄ △ △
SEGMENT:USE32
32ﾋﾞｯﾄ △ △
SEGMENT:FLAT
32ﾋﾞｯﾄFLATｾｸﾞﾒﾝﾄ △ △


80386/80486指定の場合

11. 80386/80486指定の場合

■ 簡略化ｾｸﾞﾒﾝﾄの属性

 ﾏｲｸﾛﾌﾟﾛｾｯｻ指定文(.386, .386P, .486, .486P)と.M0DEL文の記述順序で、定義されるｾｸﾞﾒﾝﾄの属性が異なります。ﾃﾞﾌｫﾙﾄの16ﾋﾞｯﾄ属性のｾｸﾞﾒﾝﾄを用いる場合は、.MODEL文の後にﾏｲｸﾛﾌﾟﾛｾｯｻを指定します。
■ 16ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄ指定時の順番
      .MODEL memory_model{,language}
      .386
一方、FLATﾒﾓﾘ･ﾓﾃﾞﾙなどの32ﾋﾞｯﾄ属性ｾｸﾞﾒﾝﾄでは、.MODEL文の前に指定します。
■ 32ﾋﾞｯﾄ･ｾｸﾞﾒﾝﾄ指定時の順番
      .386
      .MODEL memory_model{,language}

■ ｾｸﾞﾒﾝﾄのﾃﾞﾌｫﾙﾄ･ﾜｰﾄﾞ･ｻｲｽﾞ

80386以上のCPUが指定されていると、ｾｸﾞﾒﾝﾄのﾃﾞﾌｫﾙﾄのｵﾍﾟﾗﾝﾄﾞとｱﾄﾞﾚｽのｻｲｽﾞは32ﾋﾞｯﾄ(USE32がﾃﾞﾌｫﾙﾄ)となります。これを16ﾋﾞｯﾄに変更する場合は、ｾｸﾞﾒﾝﾄ定義などでUSE16の指定が必要です。

 ■ ﾎﾟｲﾝﾀ

USE32の指定が有効な場合、ｵﾌｾｯﾄは32ﾋﾞｯﾄなので、nearﾎﾟｲﾝﾀは32ﾋﾞｯﾄ、farﾎﾟｲﾝﾀは48ﾋﾞｯﾄとなります。

 ■ ﾚｺｰﾄﾞのﾌｨｰﾙﾄﾞ

 ﾚｺｰﾄﾞのﾌｨｰﾙﾄﾞの合計(ﾋﾞｯﾄ数)が、8以下では1ﾊﾞｲﾄが、9～16では2ﾊﾞｲﾄが、17～32では4ﾊﾞｲﾄが使用されます。

 ■ 数値等価記号

 =やEQUの数値等価記号で、4ﾊﾞｲﾄ以下の整数値が使用できます。


予約語一覧

12. 予約語一覧

以下にｱｾﾝﾌﾞﾗの予約語を示しますが、英字の大文字と小文字は区別されず、同一とみなされます。予約語は本来の目的以外に自由に使用できません。例えば予約語をﾗﾍﾞﾙとして使用することはできません。しかし、基本的に予約語を含む文字列は使用可能です。
ﾌﾟﾛｾｯｻの命令を表わすﾆﾓﾆｯｸとﾌﾟﾛｾｯｻのﾚｼﾞｽﾀ名 (ﾌﾟﾛｾｯｻ指定文に依存)
$ * + - . / = ? [ ] \
.186 .286 .286C .286P .287 .386 .386C .386P .387 .486 .486P .8086 .8087
.ALPHA .BREAK .C0DE .CONST .C0NTlNUE .CREF .DATA .DATA? .D0SSEG .ELSE .ELSEIF .ENDIF .ENDW .ERR .ERR1 .ERR2 .ERRB .ERRDEF .ERRDIF .ERRDIF1 .ERRE .ERRIDN .ERRIDN1 .ERRNB .ERRNDEF .ERRNZ .EXIT .FARDATA .FARDATA? .IF .LALL .LFCOND .LIST .LISTALL .LISTIF .LISTMACR0 .LISTMACROALL .M0DEL .MSFLOAT .NO87 .NOCREF .NOLIST .N0LISTIF .N0LISTMACRO .RADIX .REPEAT .SALL .SEQ .SFC0ND .STACK .STARTUP .TFCOND .TYPE .UNTIL .UNTILCXZ .WHILE .XALL .XCREF .XLIST
@B @F ADDR ALIAS ALIGN AND ASSUME BASIC BYTE C CARRY? CATSTR COMM C0MMENT DB DD DF D0SSEG DQ DT DUP DW DW0RD ECHO ELSE ELSEIF ELSEIF1 ELSEIF2 ELSEIFB ELSEIFDEF ELSEIFDIF ELSEIFDIF1 ELSEIFE ELSEIFIDN ELSEIFIDN1 ELSEIFNB ELSEIFNDEF END ENDIF ENDM ENDP ENDS EQ EQU EVEN EXITM EXTERN EXTERNDEF EXTRN FAR FAR32 FOR FORC FORTRAN FWORD GE GOTO GROUP GT HIGH HIGHWORD IF IF1 IF2 IFB IFDEF IFDIF IFDIF1 IFE IFIDN IFIDN1 IFNB IFNDEF INCLUDE INCLUDELIB SINTR INVOKE IRP IRPC LABEL LE LENGTH LENGTHOF LOCAL LOW LOWWORD LROFFSET LT MACRO MASK MOD NAME NE NEAR NEAR16 NEAR32 NOT OFFSET OPATTR OPTION OR ORG OVERFLOW PAGE PARITY? PASCAL POPCONTEXT PROC PROTO PTR PUBLIC PURGE PUSHCONTEXT QWORD RECORD REAL4 REAL8 REAL10 REPEAT REPT SBYTE SDWORD SEG SEGMENT SHL SHORT SHT SIGN? SIZE SIZEOF SIZESTR STDCALL STRUC STRUCT SUBSTR SUBTITLE SUBTTL SWORD SYSCALL TBYTE TEXTEQU THIS TITLE TYPE TYPEDEF UNION VARARG WHILE WIDTH WORD XOR ZERO?
(一部にﾌﾟﾛｾｯｻの命令のﾆﾓﾆｯｸと同一のものがありますが、これらは演算子で、文脈から命令とは区別されます。)
予約語でないが特別の意味をもつもの (ﾃｷｽﾄ･ﾏｸﾛなどでは使用不可)
ABS ALL ASSUMES AT CASEMAP COMMON C0MPACT CPU DOTNAME EMULAT0R EPIL0GUE ERROR EXP0RT EXPR16 EXPR32 FARSTACK FLAT FORCERAME HUGE LANGUAGE LARGE LlSTING LJMP LOADDS M510 MEDIUM MEMORY NEARSTACK N0D0TNAME N0EMULAT0R N0KEYW0RD N0LJMP N0M510 NONE N0NUNIQUE N00LDMACR0S NOOLDSTRUCTSNOREAD0NLY NOSC0PED N0SIGNEXTEND NOTHING NOTPUBLlC OLDMACR0S OLDSTRUCTS 0S_DOS 0S_OS2 PARA PRIVATE PR0L0GUE RADIX READ0NLY REQ SCOPED SMALL STACK TINY USE16 USE32 USES


操作規則

§2 操作規則

本章では、ﾌﾟﾛｸﾞﾗﾑの作成に用いるｺﾏﾝﾄﾞ(ﾕｰﾃｨﾘﾃｨ)について述べています。なお、あまり重要でないと思われるｺﾏﾝﾄﾞは、概要だけを示してあります。詳細はPWBまたはQHのｺﾏﾝﾄﾞで表示されるｵﾝﾗｲﾝ･ﾍﾙﾌﾟを参照してください。ほとんどのｺﾏﾝﾄﾞで、次の起動時ｵﾌﾟｼｮﾝが使用可能です。このｵﾌﾟｼｮﾝに関しては、説明を省略してあります。
■ ﾍﾙﾌﾟの共通起動行ｵﾌﾟｼｮﾝ
ｵﾌﾟｼｮﾝ 意味
/?
ｺﾏﾝﾄﾞの概要を表示する。
/HELP
QHｺﾏﾝﾄﾞが起動可能ならばｵﾝﾗｲﾝ･ﾍﾙﾌﾟを表示する。不可能ならばｺﾏﾝﾄﾞの形式とｵﾌﾟｼｮﾝの概要を表示する。
■ 関係する代表的な環境変数
変数名 参照するｺﾏﾝﾄﾞ 意味
CL
CL, H2INC 起動時のｵﾌﾟｼｮﾝのﾃﾞﾌｫﾙﾄ
H2INC
H2INC 起動時のｵﾌﾟｼｮﾝのﾃﾞﾌｫﾙﾄ
HELPFILES
CV, PWB, QH ﾍﾙﾌﾟ･ﾌｧｲﾙのﾊﾟｽまたはﾌｧｲﾙ名
INCLUDE
ML, MASM, PWB, H2INC ｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙの検索位置
INIT
LING, CV, NMAKE, PWB ﾌｧｲﾙTOOLS.INIの検索位置
ﾌｧｲﾙCURRENT.SYSの検索位置(PWB)
LIB
LINK, BIND ﾗｲﾌﾞﾗﾘの検索位置
LINK
LINK, BIND 起動時のｵﾌﾟｼｮﾝのﾃﾞﾌｫﾙﾄ
MASM
MASM 起動時のｵﾌﾟｼｮﾝのﾃﾞﾌｫﾙﾄ
ML
ML 起動時のｵﾌﾟｼｮﾝのﾃﾞﾌｫﾙﾄ
PATH
ｺﾏﾝﾄﾞ･ﾌﾟﾛｾｯｻ (COMMAND.COM) 外部ｺﾏﾝﾄﾞの実行形式ﾌｧｲﾙの検索位置
QH
QH 起動時のｵﾌﾟｼｮﾝのﾃﾞﾌｫﾙﾄ
TMP
ML, LINK, MASM, BlND, PWB, QH 一時的ﾌｧｲﾙを作成する位置

 1. MLｺﾏﾝﾄﾞ
 2. LINKｺﾏﾝﾄﾞ
  2.1 LINKのｵﾌﾟｼｮﾝ
 3. NMAKE/NMKｺﾏﾝﾄﾞ
  3.1 記述ﾌﾞﾛｯｸ
  3.2 ﾏｸﾛ
  3.3 推論規則
  3.4 ﾃﾞｨﾚｸﾃｨﾌﾞ
  3.5 記述ﾌｧｲﾙの例
  3.6 ﾌｧｲﾙT00LS.INI
 4. LlBｺﾏﾝﾄﾞ
 5. ILINKｺﾏﾝﾄﾞ
 6. BlNDｺﾏﾝﾄﾞ
 7. CV(CVP)ｺﾏﾝﾄﾞ
 8. CVPACKｺﾏﾝﾄﾞ
 9. EXEHDRｺﾏﾝﾄﾞ
10. H2INCｺﾏﾝﾄﾞ
11. lMPLlBｺﾏﾝﾄﾞ
12. PWBｺﾏﾝﾄﾞ
13. PWBRMAKEｺﾏﾝﾄﾞ
14. QHｺﾏﾝﾄﾞ
15. HELPMAKEｺﾏﾝﾄﾞ
16. MASMｺﾏﾝﾄﾞ
17. EXP,RM,UNDELｺﾏﾝﾄﾞ


MLｺﾏﾝﾄﾞ

1. MLｺﾏﾝﾄﾞ

ｿｰｽ･ﾌｧｲﾙを基にｱｾﾝﾌﾞﾙをして実行形式ﾌｧｲﾙを作成する流れを次に示します。これは最大構成の例で、すべてのﾌｧｲﾙが必要という訳ではありません。最小構成では、左側の流れのみで、ｿｰｽ･ﾌｧｲﾙをｱｾﾝﾌﾞﾙ、ﾘﾝｸして実行ﾌｧｲﾙを作成できます。
① | 入力となる各ﾌｧｲﾙは複数が可能。
② | ｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙはﾈｽﾄが可能。
③ | ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙは、そのﾌｧｲﾙ全体を結合、そのﾌｧｲﾙ内の該当するﾓｼﾞｭｰﾙを抽出して結合が各々可能。

 C言語と類似のMLｺﾏﾝﾄﾞを用いて、ｱｾﾝﾌﾞﾘ言語のｿｰｽ･ﾌｧｲﾙのｱｾﾝﾌﾞﾙとﾘﾝｸを効率的に処理できます。MLｺﾏﾝﾄﾞは、次の形式で起動します。
C:>ML {option} file {{option} file…} {option}
optionは起動時ｵﾌﾟｼｮﾝで、下表に示すものを必要に応じて指定します。fileにはｿｰｽ･ﾌｧｲﾙ名、ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ名、またはﾗｲﾌﾞﾗﾘ名を指定します。このとき、拡張子が.ASM、またはｵﾌﾟｼｮﾝ/Taを伴うﾌｧｲﾙは、ｱｾﾝﾌﾞﾙ処理が自動的に行なわれ、それ以外のﾌｧｲﾙは、そのままﾘﾝｶに渡されて、すべてが1個の実行形式ﾌｧｲﾙに結合されます。また、ｵﾌﾟｼｮﾝ/Feで指定しない限り、最初に指定されているﾌｧｲﾙのﾍﾞｰｽ名から実行形式ﾌｧｲﾙ名が決まります。例えば、ﾌﾟﾛｸﾞﾗﾑがMAIN.ASM, SUB1.ASM, SUB2.ASMから構成されている場合、次のｺﾏﾝﾄﾞで指定ﾌｧｲﾙのすべてが順次ｱｾﾝﾌﾞﾙされ、実行形式ﾌｧｲﾙMAIN.EXEが作成されます。次に例を示します。
例:
C:>ML MAIN.ASM SUB1.ASM SUB2.ASM
MAIN.EXEを生成
■ MLｺﾏﾝﾄﾞの起動行ｵﾌﾟｼｮﾝ
(形式欄の△はｽﾍﾟｰｽの意味です。)
形式 内容
ﾀｲﾆｰ･ﾒﾓﾘ･ﾓﾃﾞﾙ(*.COM)の指定 (.MODEL文でTINYが指定されていれば、ﾘﾝｸ･ｵﾌﾟｼｮﾝ/Tを自動指定)
/AT
ｻﾎﾟｰﾄを有効にし、ﾘﾝｶにｵﾌﾟｼｮﾝ/Tを渡す。
使用するﾘﾝｶの指定 (ﾃﾞﾌｫﾙﾄはLINK.EXE)
/Bl{path}exec
代替ﾘﾝｶ(execはﾌｧｲﾙ名)を指定する。
ﾘﾝｸ処理の有無 (ﾃﾞﾌｫﾙﾄはﾘﾝｸする)
/c
ｱｾﾝﾌﾞﾙだけの処理をする。
識別子の英字の大小区別 (OPTION CASEMAP:の指定が優先)
/Cx
ｸﾞﾛｰﾊﾞﾙ識別子だけの英字の大小を区別する。[ﾃﾞﾌｫﾙﾄ]
/Cp
すべての識別子の英字の大小を区別する。
/Cu
すべての識別子の英字を大小字に変換する。
ﾃｷｽﾄﾏｸﾛの定義 (TEXTEQU文と同等。複数指定が可能。同名のものはｿｰｽ中での指定が優先。)
/Dname
ﾇﾙ･ｽﾄﾘﾝｸﾞのﾃｷｽﾄﾏｸﾛを定義する。
/Dname="string"
文宇列stringのﾃｷｽﾄﾏｸﾛを定義する。 (空白や区切り文字を含まない場合は二重引用符を省略可能。環境変数では使用不可)
ﾊﾟｽ1のﾘｽﾃｨﾝｸﾞ (警告とｴﾗｰのﾒｯｾｰｼﾞを含む)
/EP
標準出力装置に出力する。
/Sf
ﾘｽﾃｲﾝｸﾞ･ﾌｧｲﾙ(*.LST)に追加する。
ｽﾀｯｸ･ｻｲｽﾞの設定 (ﾘﾝｶのｵﾌﾟｼｮﾝ/STACKと同等)
/F△hhhh
ｽﾀｯｸ･ｻｲｽﾞを16進数hhhhで指定する。
浮動小数点演算処理命令の指定 (OPTION NOEMULATORの指定が優先)
/Fpi
ｴﾐｭﾚｰﾀ･ｺｰﾄﾞを生成する。 (OPTION EMULATORと同等)
ﾌｧｲﾙの指定
/Fb{filename}
ﾊﾞｲﾝﾄﾞ形式実行ﾌｧｲﾙ(base.EXE)を作成する。
/Fefilename
実行形式ﾌｧｲﾙ名(base.EXE/base.COM)を変更する。
/FI{filename}
ﾘｽﾃｨﾝｸﾞ･ﾌｧｲﾙ(base.LST)を作成する。
/Fm{filename}
ﾘﾝｸ時のﾏｯﾌﾟ･ﾌｧｲﾙ(base.MAP)を作成する。
/Fofilename
ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ名(base.OBJ)を変更する。
/FR{filename}
ｿｰｽ･ﾌﾞﾗｳｻﾞ･ﾃﾞｰﾀﾍﾞｰｽ(base.SBR)を作成する。
/Fr{filename}
縮小されたｿｰｽ･ﾌﾞﾗｳｻﾞ･ﾃﾞｰﾀﾍﾞｰｽ(base.SBR)を作成する。
ﾃﾞﾌｫﾙﾄの言語型の設定 (OPTI0N LANGUAGE:の指定が優先)
/Gc
PASCAL言語型を指定する。 (OPTION LANGUAGE:PASCALと同等)
/Gd
C言語型を指定する。 (OPTION LANGUAGE:Cと同等)
外部名の最大長さ
/H{△}n
外部名の長さをnﾊﾞｲﾄ(1～255)に制限する。
ｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙのﾃﾞｨﾚｸﾄﾘ追加 (最大10個まで複数の指定が可能)
/I{△}path
環境変数INCLUDEの指定よりも前に検索する位置を指定する。
ﾘﾝｶのｵﾌﾟｼｮﾝを指定 (ｺﾏﾝﾄﾞ･ﾗｲﾝの最後で指定)
/link△option
ﾘﾝｶに渡すｵﾌﾟｼｮﾝ(複数可)を指定する。
ﾒｯｾｰｼﾞ表示
/nologo
処理時の標準ﾒｯｾｰｼﾞ表示を抑制する。
ﾘｽﾃｨﾝｸﾞ･ﾌｧｲﾙ内容の制御 (ｿｰｽ中の指定が優先)
/Sa
可能なすべての内容を含める。
/Sg
生成結果のｺｰﾄﾞを含める。
/Sl{△}n
1行当りの文字数(nは0または60～255)を指定する。 (ﾃﾞﾌｫﾙﾄは0、PAGE文参照)
/Sn
ｼﾝﾎﾞﾙ･ﾃｰﾌﾞﾙを含めない。
/Sp{△}n
1ﾍﾟｰｼﾞ当りの行数(nは0または60～255)を指定する。 (ﾃﾞﾌｫﾙﾄは0、PAGE文参照)
/Ss{△}"string"
ｻﾌﾞﾀｲﾄﾙを指定する。 (SUBTITLE文と同等)
/Stc"string"
ﾀｲﾄﾙを指定する。 (TITLE文と同等)
/Sx
条件が偽の処理部分を含める。 (.LISTIF文と同等)
ｿｰｽ･ﾌｧｲﾙ指定 (直後の1個のﾌｧｲﾙだけに適用)
/Ta{△}filename
ﾌｧｲﾙをｿｰｽ･ﾌｧｲﾙとしてｱｾﾝﾌﾞﾙする。
仮想ﾒﾓﾘ(EMS, XMS, ﾃﾞｨｽｸの順序で)の使用 (ﾃﾞｨｽｸでは環境変数TMPの指定位置またはｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘ) [MS-DOSのみ]
/VM
仮想ﾒﾓﾘを使用する。
警告ﾒｯｾｰｼﾞ制御 (( )内はﾒｯｾｰｼﾞ識別番号)
/W0
ｴﾗｰ(A1xxx-A2xxx)だけを表示する。
/W1
ｴﾗｰと警告(A3xxx-A4xxx)を表示する。 [ﾃﾞﾌｫﾙﾄ]
/W2
ｴﾗｰと警告(A1xxx-A5xxx)を表示する。
/W3
すべてのｴﾗｰと警告を表示する。
/W
警告を表示しない。 (/W0と同じ)
/WX
警告を致命的ｴﾗｰとする。
ｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙの標準検索の位置
/X
環境変数INCLUDE指定の標準検索位置を無視する。
ﾓｼﾞｭｰﾙ間でのｼﾝﾎﾞﾙ共有
/Zf
すべてのｼﾝﾎﾞﾙをﾊﾟﾌﾞﾘｯｸに指定する。
MASM5.1に対する互換性
/Zm
最大限の互換性を指定する。[OPTION M510と同等]
構造体のﾊﾟｯｸ制御
/Zp{n}
構造体ﾒﾝﾊﾞｰの境界(n=1，2，4)を指定する。(ﾃﾞﾌｫﾙﾄは/Zp1)
ﾃﾞﾊﾞｯｸﾞ情報
/Zd
行番号に関するﾃﾞﾊﾞｯｸﾞ情報を付加する。
/Zi
完全なﾃﾞﾊﾞｯｸﾞ情報を付加する。
ｿｰｽ･ﾌｧｲﾙの構文ﾁｪｯｸ
/Zs
構文ﾁｪｯｸだけの処理を行なう。

MLｺﾏﾝﾄﾞ起動時には、環境変数MLが自動的に参照されます。従って、起動時ｵﾌﾟｼｮﾝで常に指定するものを定義しておけば便利です。また、内部で起動されるﾘﾝｶ(LINK)も環境変数を参照します。MLｺﾏﾝﾄﾞに関連する環境変数を次表に示します。
■ MLｺﾏﾝﾄﾞに関係する環境変数
環境変数 内容
ML
MLｺﾏﾝﾄﾞが起動時に用いるｵﾌﾟｼｮﾝ
INCLUDE
INCLUDE文で指定されたﾌｧｲﾙの検索位置 (複数の場合はｾﾐｺﾛﾝで区切る)
TMP
作業用の一時的なﾌｧｲﾙを作成するﾃﾞｨﾚｸﾄﾘ (RAMﾃﾞｨｽｸなどの高速なものに割り当てる)
LINK
LINKｺﾏﾝﾄﾞが起動時に用いるｵﾌﾟｼｮﾝ
LIB
ﾃﾞﾌｫﾙﾄ･ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙの検索位置 (複数の場合はｾﾐｺﾛﾝで区切る)


LINKｺﾏﾝﾄﾞ

2. LINKｺﾏﾝﾄﾞ

LINKｺﾏﾝﾄﾞは、最終的にOS上で実行可能な実行形式ﾌｧｲﾙを作成します。代表的な実行形式ﾌｧｲﾙには.EXE形式と.COM形式があります。次にMS-DOS(ﾘｱﾙ･ﾓｰﾄﾞ)での実行形式ﾌｧｲﾙの起動状態を示します。
■ MS-DOSでのCOM形式の起動
ﾒﾓﾘ | ﾌｧｲﾙ
0FFFFH
SP → 0FFFEH
ｽﾀｯｸ
領域
IP → 0100H ﾌﾟﾛｸﾞﾗﾑ
本体 		← COMﾌｧｲﾙ
の内容
CS, DS, ES, SS → 0000H PSP
(256ﾊﾞｲﾄ) 		先頭
MCB
(16ﾊﾞｲﾄ)
■ MS-DOSでのEXE形式の起動
ﾒﾓﾘ | ﾌｧｲﾙ
CS,IP,SS,SPは
ﾘﾝｸ時に
決められた値 		0100H ﾌﾟﾛｸﾞﾗﾑ
本体
(ｽﾀｯｸ領域を含む) 		← ｺｰﾄﾞ部
DS, ES → 0000H PSP
(256ﾊﾞｲﾄ) 		ﾍｯﾀﾞ部
MCB
(16ﾊﾞｲﾄ) 		先頭
EXE形式の場合、ﾍｯﾀﾞ部には再配置情報などが含まれ、ﾛｰﾀﾞがﾍｯﾀﾞ部の情報を参照し、ｺｰﾄﾞ部を再配置します。

ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙから、実行可能な形式のﾌｧｲﾙを作成するためには、ﾘﾝｶ(linker)と呼ばれるLINKｺﾏﾝﾄﾞを使用します。次に処理内容の概要を示します。
① | 入力となるｵﾌﾞｼﾞｪｸﾄ、ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙは複数が可能。
② | ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙは、そのﾌｧｲﾙ全体を結合、そのﾌｧｲﾙ内の該当するﾓｼﾞｭｰﾙを抽出して結合が各々可能。
③ | ﾓｼﾞｭｰﾙ定義ﾌｧｲﾙはOS/2の場合のみ。

 LINKは、1個または複数のｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙを結合して、1個の実行形式ﾌｧｲﾙまたはﾀﾞｲﾅﾐｯｸ･ﾘﾝｸ･ﾗｲﾌﾞﾗﾘを作成します。入力には、複数のﾓｼﾞｭｰﾙを含むﾗｲﾌﾞﾗﾘを指定することも可能で、この場合はﾗｲﾌﾞﾗﾘに含まれるすべてのﾓｼﾞｭｰﾙが結合の対象となります。また、外部参照記号の解決などで必要ならば、指定されたﾗｲﾌﾞﾗﾘからﾓｼﾞｭｰﾙを抽出して結合します。ﾓｼﾞｭｰﾙ抽出用のﾗｲﾌﾞﾗﾘは、次の方法で指定されます。
① | LINK起動時の明示的指定
② | ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ内での暗黙指定
①の場合は、ﾌｧｲﾙ名だけではなく、ﾄﾞﾗｲﾌﾞ名やﾊﾟｽ名を含められます。②には、ｺﾝﾊﾟｲﾗがﾃﾞﾌｫﾙﾄとして指定するものと、ｿｰｽ･ﾌｧｲﾙ中でINCLUDELIB文で指定するものとがあります。これらの暗黙指定は、ﾘﾝｸ時のｵﾌﾟｼｮﾝ/NODで無効にできます。前記の2つの方法でﾗｲﾌﾞﾗﾘが指定されている場合、次の順序でﾗｲﾌﾞﾗﾘを使用します。
① | LINK起動時の指定(指定順)
② | ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ内での指定(指定されている場合)
更に、ﾊﾟｽを含まないﾌｧｲﾙ名だけのﾗｲﾌﾞﾗﾘ指定では、次の順序でﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙが検索されます。
① | ﾜｰｷﾝｸﾞ･ﾃﾞｨﾚｸﾄﾘ
② | LINKｺﾏﾝﾄﾞ起動時の指定(ﾌｧｲﾙ名を含まないﾄﾞﾗｲﾌﾞ名またはﾊﾟｽ名が指定されている場合)
③ | 環境変数LIBでの指定順
ﾘﾝｸ時には、ﾓｼﾞｭｰﾙ中のｾｸﾞﾒﾝﾄの属性に従って、ｾｸﾞﾒﾝﾄの配置を決定します。次に概要を示します。
項目 | 処理
align (ｱﾗｲﾝ) | ｾｸﾞﾒﾝﾄの先頭ｱﾄﾞﾚｽを必要に応じて00Hで空き領域を埋めることで調整
combine (結合型) | 同じ名前のｾｸﾞﾒﾝﾄを指定に従って結合
ｸﾗｽ名 (class) | 同じ名前のｸﾗｽに属するｾｸﾞﾒﾝﾄを1個の連続したﾌﾞﾛｯｸとして隣接して配置
ｾｸﾞﾒﾝﾄの順序 | ﾘﾝｸ時のｵﾌﾟｼｮﾝ/DOSSEGの指定に従ってｾｸﾞﾒﾝﾄの配置順序を決定 (ｸﾗｽ名の指定とも関連)
ｸﾞﾙｰﾌﾟ (group) | ｸﾞﾙｰﾌﾟに属するｾｸﾞﾒﾝﾄでの参照をｸﾞﾙｰﾌﾟ先頭からのｵﾌｾｯﾄに設定
ﾘﾝｸ処理でﾒﾓﾘが不足すると、ﾃﾞｨｽｸに一時ﾌｧｲﾙを作成してﾒﾓﾘの代わりに使用します。作成するﾃﾞｲﾚｸﾄﾘは環境変数TMPで指定されているﾃﾞｲﾚｸﾄﾘですが、環境変数TMPが定義されていないか、定義されていても指定されているﾃﾞｨﾚｸﾄﾘが存在しない場合は、作業ﾃﾞｨﾚｸﾄﾘになります。また、ﾌｧｲﾙ名はｼｽﾃﾑ･ｺｰﾙで生成された一時ﾌｧｲﾙ名となります。一時ﾌｧｲﾙが作成される場合は、次のﾒｯｾｰｼﾞを表示します。
Temporaryfile filename has been created.
Do not change disk in drive x:.
この場合、x:で指定されたﾄﾞﾗｲﾌﾞがﾌﾛｯﾋﾟｨ･ﾃﾞｨｽｸならば、ﾘﾝｸ終了まで交換できません。

 LINKの起動には、次表に示す項目を必要に応じて指定します。
■ LlNK起動時の指定内容 (baseは最初に指定されたｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙのﾍﾞｰｽ名)
項目 | ﾃﾞﾌｫﾙﾄ | 機能
ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ名 (ObjectModules) | なし[*.OBJ] | 必須。拡張子が.0BJの場合はﾍﾞｰｽ名だけの指定が可。作業ﾃﾞｨﾚｸﾄﾘのﾌｧｲﾙの場合はﾄﾞﾗｲﾌﾞ名とﾊﾟｽ名が省略可。ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙ*.LIBを指定した場合、ﾌｧｲﾙに含まれるすべてのｵﾌﾞｼﾞｪｸﾄを結合。
実行形式ﾌｧｲﾙ名 (RunFile) | [base.EXE] | 作業ﾃﾞｨﾚｸﾄﾘ以外に出力する場合はﾄﾞﾗｲﾌﾞ名かﾊﾟｽ名を指定。ﾌｧｲﾙ名を指定すればﾃﾞﾌｫﾙﾄを変更。
ﾏｯﾌﾟ･ﾌｧｲﾙ名 (ListFile) | 作成しない[NUL.MAP] | ﾌｧｲﾙ名指定で作成。ﾄﾞﾗｲﾌﾞ名、ﾊﾟｽ名、かｵﾌﾟｼｮﾝ/M、/Llを指定すれば、ﾃﾞﾌｫﾙﾄはbase.MAPとなる。
ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙ名 (Libraries) | [.LIB] | ﾌｧｲﾙ名指定で使用する。拡張子は.LIBの場合、省略可。作業ﾃﾞｨﾚｸﾄﾘのﾌｧｲﾙはﾄﾞﾗｲﾌﾞ名とﾊﾟｽ名が省略可。
ｵﾌﾟｼｮﾝ (option) | 環境変数LINKの指定 | ｾﾐｺﾛﾝより前で、ｽﾍﾟｰｽを入れられる任意の位置で指定可能。

LINKの起動処理には、以下に述べる3つの方法があります。

 ① ｺﾏﾝﾄﾞ･ﾗｲﾝでの指定形式
C:>LINK {option} object{,exec}{,map}{,library};
objectはｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ名で、複数を指定する場合はｽﾍﾟｰｽまたは+(ﾌﾟﾗｽ記号)でﾌｧｲﾙ名を区切ります。execは実行形式ﾌｧｲﾙ名、mapはﾏｯﾌﾟ･ﾌｧｲﾙ名を表わします。librayはﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙ名で、複数を指定する場合はｽﾍﾟｰｽまたは+(ﾌﾟﾗｽ記号)でﾌｧｲﾙ名を区切ります。これらは記述の順序が固定なので、前の項目を省略した場合、区切りの,(ｶﾝﾏ)は省略できません。また、;(ｾﾐｺﾛﾝ)は指定の終わりを表わし、これ以後に記述された内容は無視されます。ｾﾐｺﾛﾝが入力されなかった場合、入力すべき項目が残っていれば、入力要求が行なわれます。

 ② 入力要求に応答する形式
C:>LINK
LINKで起動し、次の入力要求に対して各々必要な入力をします。
object Modules [.OBJ]:{option} object
Run File [base.EXE]:exec
List File[NUL.MAP]:map
Libraries[.LIB]:library;
赤色の文字が入力する部分です。
この場合は、1行単位で入力すべき内容が指示されます。最初のｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ名は最低1個指定する必要があります。他のものは、[ ]の中にﾃﾞﾌｫﾙﾄが表示されますので、変更の必要がなければ、単に改行だけを入力します。また、それ以降の入力でﾃﾞﾌｫﾙﾄの指定を使用する場合は、直前の指定の改行の直前で;(ｾﾐｺﾛﾝ)を入力します。この形式でｵﾌﾟｼｮﾝが必要なときは、ﾌｧｲﾙ名の直前または直後のｽﾍﾟｰｽを入れられる位置に指定します。また、複数のｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙまたはﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙを指定する場合で、指定内容が1行以上になるときは、ﾌｧｲﾙ名の区切りに使用する+(ﾌﾟﾗｽ記号)を行の最後に指定します。この結果、次の行に指定を続けられます。

 ③ 応答ﾌｧｲﾙを使用する形式
C:>LINK @filename
filenameは応答ﾌｧｲﾙの名前で、ﾄﾞﾗｲﾌﾞ名またはﾊﾟｽ名を含められます。応答ﾌｧｲﾙはﾃｷｽﾄ形式の内容で、上記①②のｺﾏﾝﾄﾞ･ﾗｲﾝの形式のどちらでも記述可能です。また、ﾌｧｲﾙ名の入力可能な任意の位置で、これ以降の入力要求に対する応答内容を含む応答ﾌｧｲﾙの先頭に@(ｱｯﾄﾏｰｸ)を付加して指定することも可能です。
2.1 LINKのｵﾌﾟｼｮﾝ


LINKのｵﾌﾟｼｮﾝ

2.1 LINKのｵﾌﾟｼｮﾝ

LINKには、次表に示すｵﾌﾟｼｮﾝがあります。環境変数LINKを使用すれば、ｵﾌﾟｼｮﾝのﾃﾞﾌｫﾙﾄを設定できます。ただし、LINK起動時のｺﾏﾝﾄﾞ･ﾗｲﾝでのｵﾌﾟｼｮﾝ指定が環境変数よりも優先します。
■ LINKｺﾏﾝﾄﾞの起動行ｵﾌﾟｼｮﾝ (英字の大文字と小文字の区別はない、紫色の文字を省略した省略形が使用可能)
形式(省略形) 意味
EXE形式のﾌｧｲﾙ内でのｾｸﾞﾒﾝﾄ境界の調整
/ALIGNMENT:nn
ｾｸﾞﾒﾝﾄのｱﾗｲﾒﾝﾄの境界を2のべき乗で指定。ﾃﾞﾌｫﾙﾄは512。 (OS/2とWindowsで使用)
処理ﾓｰﾄﾞ
/BATCH
ﾊﾞｯﾁ･ﾓｰﾄﾞで実行。指定のｵﾌﾞｼﾞｪｸﾄまたはﾗｲﾌﾞﾗﾘが見つからなくても処理を続行。未解決の外部参照を含む実行形式ﾌｧｲﾙが作成可能。
/INFOMATION
ﾘﾝｸの処理過程と内容に関する詳細情報を標準出力装置に表示。
/NOLOGO
起動時のﾛｺﾞ表示を抑制。(最初に指定しなければ無効)
ﾃﾞﾊﾞｯｸﾞ情報
/CODEVIEW
CV(CodeView)のためのﾃﾞﾊﾞｯｸﾞ情報を含む実行形式ﾌｧｲﾙを作成(ｱｾﾝﾌﾞﾙ時に/Zdまたは/Ziの指定が必要)。/T指定時はﾃﾞﾊﾞｯｸﾞ情報ﾌｧｲﾙ(*.DBG)を作成。(MS-DOSで/Eとの共用は不可)
/LINENUMBERS
行番号の情報を含むﾏｯﾌﾟ･ﾌｧｲﾙを作成。
ﾛｰﾄﾞ時のﾒﾓﾘ要求量 (MS-DOSのEXE形式)
/CPARMAXALLOC:nn
ﾌﾞﾛｸﾞﾗﾑのﾛｰﾄﾞ時に必要なﾒﾓﾘのﾊﾟﾗｸﾞﾗﾌ(16ﾊﾞｲﾄ単位)数(1～65535)を指定。ﾃﾞﾌｫﾙﾄは65535で、これはﾛｰﾄﾞ時に使用可能な連続ﾒﾓﾘの最大値に変更される。(ﾘﾝｸ後はEXEHDRｺﾏﾝﾄﾞでも変更可能)
ｾｸﾞﾒﾝﾄ位置
/DOSSEG
次の順序でｾｸﾞﾒﾝﾄを配置 (ｱｾﾝﾌﾞﾘ言語用、/N0Nを参照)
① | ｸﾗｽ名が 'CODE'で終わるｾｸﾞﾒﾝﾄ
② | DGROUP以外のｾｸﾞﾒﾝﾄ
③ DGROUPのｾｸﾞﾒﾝﾄ(以下の順序)
① | ｸﾗｽ名が 'BEGDATA'のｾｸﾞﾒﾝﾄ (このｸﾗｽ名は予約されている)
② | 下記以外のｸﾗｽ('C0NST','DATA'など)のｾｸﾞﾒﾝﾄ
③ | ｸﾗｽ名が 'BSS'のｾｸﾞﾒﾝﾄ
④ | ｸﾗｽ名が 'STACK'のｾｸﾞﾒﾝﾄ
次のｼﾝﾎﾞﾙを定義する。
_edate=DGROUP:BSS
_end=DGROUP:STACK
 _TEXTｾｸﾞﾒﾝﾄが定義されていれば、その先頭に16ﾊﾞｲﾄのﾇﾙ･ｺｰﾄﾞ(00H)を挿入する。
/NONULLSDOSSEG
_TEXTｾｸﾞﾒﾝﾄの先頭に余分のﾊﾞｲﾄを付ｶﾛしない。ぞれ以外は/DOの指定と同じで/DOより優先。
/NOGROUPASSOCIATIN
ｸﾞﾙｰﾌﾟ指定を無視。 (主にｱｾﾝﾌﾞﾘ言語で使用)
ﾒﾓﾘへのﾛｰﾄﾞ位置 (MS-DOSのEXE形式)
/DSALLOCATE
ﾃﾞｰﾀをﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄの上位に配置。/HIと共に用いる。 (主にｱｾﾝﾌﾞﾘ言語で使用)
/HIGH
ﾒﾓﾘの再上位にﾛｰﾄﾞする実行形式ﾌｧｲﾙを作成。/DSと共に用いる。
EXE形式のﾌｧｲﾙ･ｻｲｽﾞ
/EXEPACK
実行形式ﾌｧｲﾙをﾊﾟｯｸ(圧縮)。/CO, /INCとの同時指定は不可。 (MS-DOSではﾃﾞﾊﾞｯｸﾞ不可となる)
farのCALL命令を最適化
/FARCALLTRANSLATION
farのCALL命令を最適化。/T指定時は自動的に指定される。 (実行時間を短縮できる。)
/NOFARCALLTRANSLATION
/Fの指定を無効。 [ﾃﾞﾌｫﾙﾄ]
ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸ処理
/INCREMENTAL
以後のｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸに必要な処理を行ない、補助ﾌｧｲﾙ(*.SYMと*.ILK)を作成。/Eや/Tの同時指定不可。
/PADCODE:nn
ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸ用に各ｺｰﾄﾞ･ｾｸﾞﾒﾝﾄの最後に空き領域のﾊﾞｲﾄを付加。 (/INC指定時は16ﾊﾞｲﾄ指定がﾃﾞﾌｫﾙﾄ)
/PADDATA:nn
ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸ用に各ﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄの最後に空き領域のﾊﾞｲﾄを付加。
ﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾞﾙのﾘｽﾄ
/MAP
ﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾞﾙを含むﾏｯﾌﾟ･ﾌｧｲﾙを作成。 (この指定なしではｾｸﾞﾒﾝﾄのﾘｽﾄのみ)
ﾃﾞﾌｫﾙﾄ･ﾗｲﾌﾞﾗﾘ (複数回の指定が可能)
/NODEFAULTLIBRARYSEARCH{:lib}
ｵﾌﾞｼﾞｪｸﾄで指定されているﾃﾞﾌｫﾙﾄのﾗｲﾌﾞﾗﾘを無視。この直後に特定のﾌｧｲﾙ名lib が指定可能。
ﾗｲﾌﾞﾗﾘ中の拡張辞書の検索
/NOEXTDICTIONARY
拡張辞書の検索を禁止。 (ｼﾝﾎﾞﾙ多重定義のｴﾗｰ抑制時に使用)
外部参照記号の英字
/NOIGNORECASE
参照記号の英字の大文字と小文字を区別する。 (主にC言語で使用)
隣接ｾｸﾞﾒﾝﾄのﾊﾟｯｸ (/PACKDは0S/2，Windows用)
/NOPACKCODE
/PACKCの指定を無効。 (ﾃﾞﾌｫﾙﾄでは/PACKC有効)
/PACKCODE{:nn}
隣接するｺｰﾄﾞ･ｾｸﾞﾒﾝﾄをまとめる。nnは最大ｻｲｽﾞ(ﾊﾞｲﾄ)でﾃﾞﾌｫﾙﾄは65536。
/PACKDATA{:nn}
隣接するﾃﾞｰﾀ･ｾｸﾞﾒﾝﾄをまとめる。nnは最大ｻｲｽﾞ(ﾊﾞｲﾄ)でﾃﾞﾌｫﾙﾄは65536。
ｵｰﾊﾞﾚｲ制御用の割り込み番号 (MS-DOSのEXE形式)
/OVERLAYINTERRUPT:nn
ｵｰﾊﾞﾚｲ制御用の割り込み番号(0～255)を指定。ﾃﾞﾌｫﾙﾄは63(3FH)。
ﾘﾝｸ処理の一時的中断
/PAUSE
実行形式ﾌｧｲﾙを作成する前にﾒｯｾｰｼﾞを表示して処理を一時的に中断。 (出力用ﾌﾛｯﾋﾟｨ･ﾃﾞｨｽｸの交換などが可能となるが、一時ﾌｧｲﾙなどが作成されているﾃﾞｨｽｸは交換不可)
出力ﾌｧｲﾙの形式指定
/PMTYPE:type
ﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞでのｳｲﾝﾄﾞｳ･ﾀｲﾌﾟtypeを以下のどれかで指定。 (ﾃﾞﾌｫﾙﾄはNOVIO)
PMまたはWINDOWAPI
VIOまたはWINDOWCOMPAT
NOVIOまたはNOTWINDOWCOMPAT
(ﾓｼﾞｭｰﾙ定義ﾌｧｲﾙのNAME文の指定と同等)
/QUICKLIB
Quicklibrary(*.QLB)の作成を指定。
/TINY
COM形式実行ﾌｧｲﾙの作成を指定。 (/Fを自動的に仮定、/INCとの同時指定不可)
処理可能な最大ｾｸﾞﾒﾝﾄ数
/SEGMENTS:nn
ﾘﾝｸ処理可能な最大ｾｸﾞﾒﾝﾄ数(1～16,384)を指定。 (ﾃﾞﾌｫﾙﾄは128)
EXE形式のｽﾀｯｸ･ｾｸﾞﾒﾝﾄのｻｲｽﾞ
/STACK:nn
ｵﾌﾞｼﾞｪｸﾄに含まれるｽﾀｯｸのｻｲｽﾞをnnﾊﾞｲﾄに変更。 (ﾃﾞﾌｫﾙﾄは1024、C言語は2048) (ﾘﾝｸ後はEXEHDRｺﾏﾝﾄﾞで変更可)
ｵﾌｾｯﾄ処理時の警告
/WARNFIXUP
ｸﾞﾙｰﾌﾟ内ｵﾌｾｯﾄがｾｸﾞﾒﾝﾄ内ｵﾌｾｯﾄに変更された場合に警告をする。 (OS/2, Windows用)
注意: 数値nnの指定形式は以下。
10進数 (0～65535)
0で始まる8進数 (0～0177777)
0Xで始まる16進数 (0～0XFFFF)


NMAKE/NMKｺﾏﾝﾄﾞ

3. NMAKE/NMKｺﾏﾝﾄﾞ

NMAKEｺﾏﾝﾄﾞは、ﾌﾟﾛｸﾞﾗﾑ作成手順を自動化するために使用します。このｺﾏﾝﾄﾞでは、ﾌﾟﾛｼﾞｪｸﾄ(project)と言う考え方が用いられます。使用される記述ﾌｧｲﾙで、ﾀｰｹﾞｯﾄ･ﾌｧｲﾙと依存ﾌｧｲﾙの更新日時が処理の判断に用いられます。なお、類似のものとして、NMKｺﾏﾝﾄﾞがあります。NMKｺﾏﾝﾄﾞは、MS-DOSでﾒﾓﾘ不足が生じるような場合に使用します。NMAKEｺﾏﾝﾄﾞと完全な互換性はありませんが、通常の処理では問題ありません。また、PWBで作成される記述ﾌｧｲﾙは、いずれのｺﾏﾝﾄﾞでも使用可能です。両者は、NMAKEはﾀｰｹﾞｯﾄ処理の各ｽﾃｯﾌﾟでﾌｧｲﾙの更新日時をﾁｪｯｸしますが、NMKは処理の開始時に一度だけﾁｪｯｸする点が異なっています。NMAKEｺﾏﾝﾄﾞは、次のような特徴をもちます。
◆ | 起動時に指定したﾀｰｹﾞｯﾄだけを更新します。ただし、これが指定されていなければ、記述ﾌｧｲﾙの最初に現われるﾀｰｹﾞｯﾄだけを更新します。記述ﾌｧｲﾙ内のﾌﾞﾛｯｸは、ｼｰｹﾝｼｬﾙに連続して処理されるのではなく、ﾀｰｹﾞｯﾄ生成に必要なﾌﾞﾛｯｸが選択されて処理されます。
◆ | 記述ﾌｧｲﾙは、起動時ｵﾌﾟｼｮﾝ /Fに続けて指定します。記述ﾌｧｲﾙ名がMAKEFILEの場合は指定を省略できます。
◆ | ﾏｸﾛの名前では、英字の大小が区別されます。
NMAKEｺﾏﾝﾄﾞの形式を次に示します．
C:>NMAKE {option} {macro} {target}
optionには、以下の表に示されｵﾌﾟｼｮﾝを複数指定できます。記述ﾌｧｲﾙは/Fで指定されている記述ﾌｧｲﾙ、ｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘのﾌｧｲﾙMAKEFILEの順で検索し、最初に一致したﾌｧｲﾙを使用しますが、ｵﾌﾟｼｮﾝ、ﾏｸﾛ定義、疑似ﾏｸﾛ.SUFFIXESで指定されている拡張子をもつﾌｧｲﾙは除きます。macroには、次の形式でﾏｸﾛ定義として、変数に文字列を定義できます。これは、複数の指定が可能です。
name={"text"}
"name=text"
nameはﾏｸﾛの名前で、英数字と_(下線)で構成し、英字の大小は区別されます。textはnameに割り当てる任意の文字列です。文字列の内部にﾀﾌﾞやｽﾍﾟｰｽなどの空白文字を含む場合は"(二重引用符)が必要です。文字列を省略した場合は、ﾇﾙ文字列(長さ0の文字列)の指定となります。ｺﾏﾝﾄﾞ･ﾗｲﾝのﾏｸﾛ定義では、全体を二重引用符で囲まない場合、=(等号)の前後に空白文字を入れられません。targetは、更新されるﾀｰｹﾞｯﾄで、省略時は記述ﾌｧｲﾙ中の先頭のﾀｰｹﾞｯﾄだけが対象となります。ﾀｰｹﾞｯﾄには、複数を指定できます。
■ NMAKEのｵﾌﾟｼｮﾝ (英字の大小は区別されません。)
option 意味
/A
ﾌｧｲﾙの更新日時を無視して、ﾀｰｹﾞｯﾄ更新に必要なｺﾏﾝﾄﾞをすべて実行する。
/C
NMAKEの起動ﾒｯｾ-ｼﾞと致命的ｪﾗｰ以外n表示を抑制する。
/D
記述ﾌｱｲﾙの検査で、ﾌｧｲﾙの更新日時を表示する。
/E
記述ﾌｧｲﾙ内のﾏｸﾛ定義よりも環境変数の定義を優先する。
/F file
使用する記述ﾌｧｲﾙの名前を指定する。fileに-を指定すると標準入力装置から記述ﾌｧｲﾙの内容を読込む。このｵﾌﾟｼｮﾝを省略すると、記述ﾌｧｲﾙ名としてMAKEFILE を仮定する。
/I
起動したｺﾏﾝﾄﾞの終了ｺｰﾄﾞを無視し、ｴﾗ-が生じても処理を続行する。
/N
記述ﾌｧｲﾙ中の実行すべきｺﾏﾝﾄﾞを表示するが実行しない。[動作確認用]
/NOLOGO
NMAKE起動時のﾛｺﾞ表示を抑制する。
/P
すべてのﾏｸﾛ定義とﾀｰｹﾞｯﾄの記述を表示する。
/Q
NMAMKEの終了ｺｰﾄﾞとして、ﾀｰｹﾞｯﾄが最新ならば0、それ以外は0以外の値を設定。[ﾊﾞｯﾁ･ﾌｧｲﾙでの利用]
/R
TOOLS.INIﾌｧｲﾙ中の推論規則とﾏｸﾛを無視する。
/S
実行で、ｺﾏﾝﾄﾞ行を表示しない。
/T
最新でない更新されるべきﾀｰｹﾞｯﾄのﾌｧｲﾙ内容を更新せずに、更新日時だけを現在の日時に変更する。
/X file
ｴﾗｰ出力を、ﾌｧｲﾙまたはﾃﾞﾊﾞｲｽに変更する。fileに - を指定すると、標準入出力装置に出力する。
/Z
(PWBの内部で使用する)

NMAKEでは、指定内容をﾌｧｲﾙから入力できます。これは、ｺﾏﾝﾄﾞ･ﾗｲﾝでの論理行の長さ制限(DOSでは128文字、OS/2のﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞでは256文字)を越えるような場合に有用です。
C:>NMAKE @file
fileは、前記のｺﾏﾝﾄﾞ･ﾗｲﾝでのﾊﾟﾗﾒｰﾀを含むﾃｷｽﾄ･ﾌｧｲﾙです。このﾌｧｲﾙ中での各ﾊﾟﾗﾒｰﾀの区切りには改行を使用でき、これはｽﾍﾟｰｽとして解釈されます。ただし、ﾏｸﾛ定義を途中で改行する場合は、C言語の論理行の拡張と同様に、ｴｽｹｰﾌﾟ･ｼｰｹﾝｽの\を改行の直前に挿入します。

 NMAKEで用いる記述ﾌｧｲﾙは複数のﾌﾞﾛｯｸから構成されます。これには、記述ﾌﾞﾛｯｸ、ﾏｸﾛ定義、さらに推論規則のﾌﾞﾛｯｸがあります。記述ﾌｧｲﾙ中では、以下の文字は特殊な意味をもちます．
# ( ) $ ^ \ { } ! @ -
これらの特殊文字を単なる文字として扱うためには、ｴｽｹｰﾌﾟ記号として$を直前に付加します。ただし、特殊文字の直前以外での記号は無視されます。記号$を単なる文字として処理する場合は、$$も同様に使用できます。
3.1 記述ﾌﾞﾛｯｸ
3.2 ﾏｸﾛ
3.3 推論規則
3.4 ﾃﾞｨﾚｸﾃｨﾌﾞ
3.5 記述ﾌｧｲﾙの例
3.6 ﾌｧｲﾙT00LS.INI


記述ﾌﾞﾛｯｸ

3.1 記述ﾌﾞﾛｯｸ

ﾌﾞﾛｯｸの中で中心的役割を成すもので、必要なｺﾏﾝﾄﾞ処理を記述します。
 target:  {dependent …}{#comment}
{#comment}
          {command}
           …
           …
記号#はｺﾒﾝﾄcommentの開始を意味し、この記号からその行の最後までの内容は無視されます。

 targetは、これに続くｺﾏﾝﾄﾞ行の処理で更新されるべきﾀｰｹﾞｯﾄを指定します。代表的なものには実行形式ﾌｧｲﾙ名があります。ﾀｰｹﾞｯﾄと依存ﾌｧｲﾙを含む行を依存記述行と呼ぶ場合があります。複数のﾀｰｹﾞｯﾄを記述するときは、それぞれをｽﾍﾟｰｽで区切ります。ﾀｰｹﾞｯﾄは行の先頭から記述し、1文字の場合、ﾄﾞﾗｲﾌﾞ名との区別のために、直後のｺﾛﾝとの間にｽﾍﾟｰｽが必要です。次は、依存記述行の例です。
SAMPLE.EXE:MAIN.OBJ SUB.OBJ LIBRARY.LIB
ﾀｰｹﾞｯﾄの更新処理が複雑で、1個の記述ﾌﾞﾛｯｸのｺﾏﾝﾄﾞで表わせない場合は、ﾀｰｹﾞｯﾄを複数の記述ﾌﾞﾛｯｸに含めて記述できます。この場合は、ﾀｰｹﾞｯﾄの直後に2個のｺﾛﾝ::を用います。同じﾀｰｹﾞｯﾄをもつ連続した依存記述行は、1つの依存記述行として解釈されます。ﾀｰｹﾞｯﾄにはﾜｲﾙﾄﾞ･ｶｰﾄﾞの*や?が使用できます。これは、対応する複数のﾌｧｲﾙ名(ﾀｰｹﾞｯﾄ)に展開されて処理されます。

 ﾀｰｹﾞｯﾄには疑似ﾀｰｹﾞｯﾄと呼ばれるものを使用できます。これを用いれば、ﾌｧｲﾙのｸﾞﾙｰﾌﾟ化やｺﾏﾝﾄﾞのｸﾞﾙｰﾌﾟ化が行なえます。疑似ﾀｰｹﾞｯﾄはﾌｧｲﾙ名とは異なり、常に更新される条件を満たすために、依存ﾌｧｲﾙに関連する処理が常に行なわれることになります。例えば、ALL:SAMPLE.EXE TEST.EXEでは、SAMPLE.EXEとTEST.EXEが更新されます。疑似ﾀｰｹﾞｯﾄでは、英字の大小が区別されます。また、次表に示す定義済みの疑似ﾀｰｹﾞｯﾄが存在します。
■ NMAKEの定義済み疑似ﾀｰｹﾞｯﾄ
ﾀｰｹﾞｯﾄ名 意味
.IGNORE:
これ以降、起動したｺﾏﾝﾄﾞの終了ｺｰﾄﾞを無視する。NMAKEのｵﾌﾟｼｮﾝ/Iと等価。
.PRECIOUS:target
ﾀｰｹﾞｯﾄを更新するｺﾏﾝﾄﾞが正常終了でなくても、ﾀｰｹﾞｯﾄを削除しない。ﾃﾞﾌｫﾙﾄでは確実なﾀｰｹﾞｯﾄ更新以外は、ﾀｰｹﾞｯﾄを削除する。これを含む記述ﾌｧｲﾙすべてに有効。
.SILENT:
これ以降の実行でｺﾏﾝﾄﾞ行を表示しない。NMAKEのｵﾌﾟｼｮﾝ/Sと等価。
.SUFFIXES:list
依存ﾌｧｲﾙが未指定の場合のﾀｰｹﾞｯﾄ更新で用いるﾌｧｲﾙ拡張子を指定する。依存ﾌｧｲﾙが未記述の場合、ﾀｰｹﾞｯﾄのﾍﾞｰｽ名とこの拡張子のﾌｧｲﾙを検索し、見つかればそれを依存ﾌｧｲﾙとして推論規則を適用する。listには複数の拡張子が指定可能で、記述されている順に、依存ﾌｧｲﾙを検索する。ﾃﾞﾌｫﾙﾄとして.EXE .OBJ .ASM .C .BAS .RES .RCが定義されている。拡張子が記述されていれば、以前の定義内容への追加指定になる。以前の指定を無効にするためには、listを省略した形式を用いる。これを含む記述ﾌｧｲﾙすべてに有効。

dependentは、ﾀｰｹﾞｯﾄ更新に用いられる依存ﾌｧｲﾙで、複数の場合はｽﾍﾟｰｽで区切ります。依存ﾌｧｲﾙのいずれかがﾀｰｹﾞｯﾄよりも新しければ、ﾀｰｹﾞｯﾄが更新されます。もし依存ﾌｧｲﾙのいずれかが他の記述ﾌﾞﾛｯｸのﾀｰｹﾞｯﾄになっているならば、現在のﾀｰｹﾞｯﾄよりも先に、ﾀｰｹﾞｯﾄになっている依存ﾌｧｲﾙの処理判断を行ないます。以下同様にして、依存ﾌｧｲﾙの必要な更新処理がすべて完了してから、最後にﾀｰｹﾞｯﾄの更新処理を行ないます。依存ﾌｧｲﾙには、検索用のﾃﾞｨﾚｸﾄﾘを次の形式で指定できます。
{pass{;path…}}dependent
{ }の中に相対ﾊﾟｽまたは絶対ﾊﾟｽを、複数の場合はｾﾐｺﾛﾝで区切って指定します。依存ﾌｧｲﾙを、最初にｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘ、次に記述の順序でﾃﾞｨﾚｸﾄﾘを検索します。見つからなければ、依存ﾌｧｲﾙを生成する推論規則を適用します。依存ﾌｧｲﾙにはﾜｲﾙﾄﾞ･ｶｰﾄﾞの*や?を使用できます。これはﾀｰｹﾞｯﾄの処理時に、対応する複数のﾌｧｲﾙ名に展開されます。

 commandは、―般にはﾀｰｹﾞｯﾄ更新のためのｺﾏﾝﾄﾞで、通常のｺﾏﾝﾄﾞ･ﾗｲﾝで指定するのと同様の内容を記述します。ただし、ｺﾏﾝﾄﾞの記述は、各行の先頭からではなく、必ず最初にﾀﾌﾞまたはｽﾍﾟｰｽが必要です。また、C言語と同様に、行の最後に記号\を記述して改行すれば、論理行の拡張が可能です。さらに、次の形式を用いれば、依存ﾌｧｲﾙの直後にｺﾏﾝﾄﾞを記述できます。
target :{dependent…}; command
ｺﾏﾝﾄﾞに必要な応答ﾌｧｲﾙは、ｲﾝﾗｲﾝ･ﾌｧｲﾙと呼ばれる次の形式を用いれば、記述ﾌｧｲﾙ内で自動的に作成できます。
target : dependent
         command << {file1}{<<{file2}…}
text1 (fi1e1の内容)
…
<<{mode1}
{text2 (file2の内容)
…
<<{mode2}}
…
fileは<<と<<で囲まれた内容を保存するためのﾌｧｲﾙ名で、省略時はNMAKEが一意的な名前を決めます。ｲﾝﾗｲﾝ･ﾌｧｲﾙの内容には、後述のﾏｸﾛの参照も記述できます。modeにはKEEPまたはNOKEEPを指定します。KEEP指定時はﾌｧｲﾙを保存した状態でNMAKE終了します。NOKEEPまたはmode省略時は一時的ﾌｧｲﾙとみなし、NMAKE終了時にﾌｧｲﾙを削除します。複数のｲﾝﾗｲﾝ･ﾌｧｲﾙを記述する場合は前記の例のようにします。

 ｲﾝﾗｲﾝ･ﾌｧｲﾙは、これを定義しているｺﾏﾝﾄﾞの場合は<<{file}で参照できます。これ以降のｺﾏﾝﾄﾞでの参照は、ｲﾝﾗｲﾝ･ﾌｧｲﾙ名fileを使用します。例えば、ｺﾏﾝﾄﾞで応答ﾌｧｲﾙ名に@を付けて指定するような場合には、@<<{file}となります。ｲﾝﾗｲﾝ･ﾌｧｲﾙは、環境変数TMPが定義されていれば指定されているﾃﾞｨﾚｸﾄﾘに、定義されていなければｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘに作成されます。

 各ｺﾏﾝﾄﾞには、次表に示すｺﾏﾝﾄﾞ修飾子を用いることができます。これはｺﾏﾝﾄﾞの先頭に付加して指定します。また、複数の使用も可能です。
■ NMAKEｺﾏﾝﾄﾞ修飾子
修飾子 意味
@
実行時に、ｺﾏﾝﾄﾞ行を表示しない。
-
ｺﾏﾝﾄﾞのｴﾗｰをﾁｪｯｸしない。
-n
ｺﾏﾝﾄﾞの終了ｺｰﾄﾞnを越えたならば処理を中断する。
!
ｺﾏﾝﾄﾞで特殊ﾏｸﾛ$?または$**が使用されていれば、各依存ﾌｧｲﾙに対してｺﾏﾝﾄﾞを実行する。


NMAKEのﾏｸﾛ

3.2 ﾏｸﾛ

ﾏｸﾛを用いれば、記述ﾌｧｲﾙ中の文字列を、NMAKE起動時に容易に変更できます。ﾏｸﾛの使用には、定義と参照があります。ﾏｸﾛを定義するには、次の方法があります。
◆ | ｺﾏﾝﾄﾞ･ﾗｲﾝでの定義
◆ | 記述ﾌｧｲﾙでの定義
◆ | ﾌｧｲﾙT0OLS.INIでの定義
記述ﾌｧｲﾙとﾌｧｲﾙTOOLS.INIでは、次の形式で定義します。
name = text
nameはﾏｸﾛの名前で、各行の先頭から記述します。また、英数字と_(下線)で構成し、英字の大小は区別されます。textはnameに割り当てる任意の文字列です。=(等)の前後の空白文字は無視されますが、文字列textの内部の空白文字は文字列の一部となります。文字列を省略した場合は、ﾇﾙ文字列の指定となります。ﾏｸﾛは次の形式で参照します。
$(name)
この$(name)が定義内容のtextと置換されます。ﾏｸﾛ名nameが1文字の場合は括弧( )を省略できます。ﾏｸﾛ参照では、以下の優先順序で定義が検索されます。環境変数の優先順位に関しては、NMAKE起動時ｵﾌﾟｼｮﾝ/Eを参照してください。
① | NMAKE起動時のｺﾏﾝﾄﾞ･ﾗｲﾝでの定義
② | 記述ﾌｧｲﾙ内での定義 (ｲﾝｸﾙｰﾄﾞされたﾌｧｲﾙを含む)
③ | 環境変数での定義 (ﾏｸﾛ名の英字はすべて大文字)
④ | ﾌｧｲﾙTOOLS.INIでの定義
⑤ | NMAKEでの定義済みの内容
NMAKEは起動時に、環境変数名と同じﾏｸﾛ名を定義します。これは、環境変数の定義内容を受け継いでいるので、継承ﾏｸﾛとも呼ばれます。継承ﾏｸﾛの英字はすべて大文字で、参照だけではなく再定義も可能です。ただし、継承ﾏｸﾛの定義内容を変更しても、変更は記述ﾌｧｲﾙ内だけで有効で、元の環境変数の内容は影響を受けません。

 NMAKEには、次表に示す定義済みのﾏｸﾛが存在します。
■ NMAKEの定義済みﾏｸﾛ
ﾏｸﾛ名 意味
$@
現在のﾀｰｹﾞｯﾄのﾌｧｲﾙ名
$*
現在のﾀｰｹﾞｯﾄのﾌｧｲﾙのﾍﾞｰｽ名
$**
現在の依存ﾌｧｲﾙのﾘｽﾄ全体
$?
現在のﾀ―ｹﾞｯﾄよりも新しい依存ﾌｧｲﾙのﾘｽﾄ
$$@
現在評価対象のﾀ-ｹﾞｯﾄ (依存ﾌｧｲﾙの指定で使用)
$<
現在のﾀｰｹﾞｯﾄよりも新しい依存ﾌｧｲﾙ (推論規則で使用)
$(AS)
ﾏｸﾛｱｾﾝﾌﾞﾗ起動ｺﾏﾝﾄﾞ [ﾃﾞﾌｫﾙﾄはAS=ml]
$(AFLAGS)
ﾏｸﾛｱｾﾝﾌﾞﾗ起動ｵﾌﾟｼｮﾝ [ﾃﾞﾌｫﾙﾄはなし]
$(BC)
BASICｺﾝﾊﾟｲﾗ起動ｺﾏﾝﾄﾞ [ﾃﾞﾌｫﾙﾄはBC=bc]
$(BFLAGS)
BASlCｺﾝﾊﾟｲﾗ起動ｵﾌﾟｼｮﾝ [ﾃﾞﾌｫﾙﾄはなし]
$(CC)
C言語のｺﾝﾊﾟｲﾗ起動ｺﾏﾝﾄﾞ [ﾃﾞﾌｫﾙﾄはCC=cl]
$(CFLAGS)
C言語のｺﾝﾊﾟｲﾗ起動ｵﾌﾟｼｮﾝ [ﾃﾞﾌｫﾙﾄはなし]
$(F0R)
F0RTRANｺﾝﾊﾟｲﾗ起動ｺﾏﾝﾄﾞ [ﾃﾞﾌｫﾙﾄはF0R=fl]
$(FFLAGS)
F0RTRANｺﾝﾊﾟｲﾗ起動ｵﾌﾟｼｮﾝ [ﾃﾞﾌｫﾙﾄはなし]
$(MAKE)
NMAKEを起動した時に用いたｺﾏﾝﾄﾞ名 (NMAKEの再帰的起動で使用)[再定義可能]
$(MAKEDIR)
NMAKEを起動したﾃﾞｲﾚｸﾄﾘ
$(MAKEFLAGS)
現在有効なNMAKEｵﾌﾟｼｮﾝの内容(NMAKEの再帰的起動で現ｵﾌﾟｼｮﾝを受け渡すために使用)[再定義不可能]
$(RC)
ﾘｿｰｽ･ｺﾝﾊﾟｲﾗ起動ｺﾏﾝﾄﾞ [ﾃﾞﾌｫﾙﾄはRC=rc]
$(RFLAGS)
ﾘｿｰｽ･ｺﾝﾊﾟｲﾗ起動ｵﾌﾞｼｮﾝ [ﾃﾞﾌｫﾙﾄはなし]

これらの定義済みﾏｸﾛの内、最初の6個($@, $*, $**, $?, $$@, $<)には、次表に示すような、ﾌｧｲﾙの一部を指定するための修飾子を直後に付加できます。ただし、修飾子を用いる場合は、次の例のように、括弧が必要です。
$(@F)
■ NMAKEの定義済みﾏｸﾛ用修飾子
修飾子 意味
B
ﾍﾞｰｽ名 (ﾄﾞﾗｲﾌﾞ名、ﾊﾟｽ、拡張子を取り除いた残りの部分)
D
ﾄﾞﾗｲﾌﾞ名とﾊﾟｽ (ﾍﾞｰｽ名と拡張子を取り除いた残りの部分)
F
ﾌｧｲﾙ名 (ﾄﾞﾗｲﾌﾞ名とﾊﾟｽを取り除いた残りの部分)
R
ﾄﾞﾗｲﾌﾞ名とﾊﾟｽとﾍﾞｰｽ名 (拡張子を取り除いた残りの部分)

ﾏｸﾛ参照時には、次の形式で文字列の置換が可能です。
$(name:str1=str2)
ﾏｸﾛ定義での文字列text中のstr1がstr2で置き換えられます。ﾏｸﾛ名と直後のｺﾛﾝの間には空白を入れられません。ｺﾛﾝの直後から等号の直前までがstr1として解釈されます。str2が省略された場合(ﾇﾙ･ｽﾄﾘﾝｸﾞ)は、str1の削除指定となります。この操作ではﾏｸﾛ定義の内容は影響を受けません。また、定義済みﾏｸﾛの場合でも、次の例のように、括弧は省略できません。
$(@:noname=name)
記述ﾌｧｲﾙでは、PWBのextmakeｽｲｯﾁと同じ構文が使用できます。これは依存記述行の最初の依存ﾌｧｲﾙだけに関するもので、次の形式で記述します。
%|xF
xは依存ﾌｧｲﾙの情報部分を表わし、次表の文字を、必要ならば複数指定します。ｺﾏﾝﾄﾞ･ﾗｲﾝでの記述では、記号%は置換文字なので、引数中の%には余分の%を1個付加する必要があります。
■ extmakeｽｲｯﾁの構文での記号
記号 意味
d
ﾄﾞﾗｲﾌﾞ名
e
ﾌｧｲﾙの拡張子
f
ﾌｧｨﾙのﾍﾞｰｽ名
p
ﾊﾟｽ
s
完全ﾌｧｲﾙ名


推論規則

3.3 推論規則

推論規則は、ｺﾏﾝﾄﾞをもたない依存記述行のみの記述ﾌﾞﾛｯｸに対して、依存ﾌｧｲﾙが記述されている場合は、ﾀｰｹﾞｯﾄの拡張子と依存ﾌｧｲﾙの拡張子の組合せから、適用可能な推論規則を用います。依存ﾌｧｲﾙが記述されていない場合は、ﾀｰｹﾞｯﾄのﾍﾞｰｽ名と疑似ﾀｰｹﾞｯﾄ.SUFFIXESで指定されている拡張子のいずれかを組合せたﾌｧｲﾙ名をｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘで検索し、もしﾌｧｲﾙが存在すれば、適用可能な推論規則を用います。これにより、記述ﾌﾞﾛｯｸの簡略化が可能となります。推論規則は、以下に述べるﾌﾞﾛｯｸ形式で定義し、記述ﾌｧｲﾙまたはﾌｧｲﾙTOOLS.INIに含められます。
{{in_path}}.in{{out_path}}.out:
        command
       {command}
        …
        …
.inと.outは、いずれもﾌｧｲﾙの拡張子です。これは行の先頭から記述し、間に空白を入れられません。拡張子.inをもつﾌｧｲﾙが拡張子.outをもつﾌｧｲﾙに変換されるように、ﾌﾟﾛｯｸ内のこれに続くｺﾏﾝﾄﾞを記述します。{ }を用いてﾊﾟｽを指定すれば、それぞれのﾃﾞｨﾚｸﾄﾘをｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘから変更できます。 例として、推論規則
.ASM.OBJ:
        ML /c $*.ASM
が定義されていれば、記述ﾌﾞﾛｯｸ
sample.OBJ : sample.ASM
では、拡張子.OBJと.ASMが推論規則に対応するので、sample.ASMがsample.OBJよりも新しいか、sample.OBJが存在しなければ、
ML /c sample.ASM
の処理が行なわれます。更に、
sample.OBJ :
の場合、ﾀｰｹﾞｯﾄのﾍﾞｰｽ名sampleと拡張子.OBJを手掛かりにして、この例ではﾌｧｲﾙsample.ASMが存在すれば、上記と同様の処理を行ないます。

 NMAKEでは、標準的な処理として、次表に示す内容の推論規則が定義されています。推論規則の適用が必要になると、以下の順序で規則が検索されます。
① | 記述ﾌｧｲﾙでの定義
② | ﾌｧｲﾙT0OLS.INIでの定義
③ | 定義済み推論規則
■ NMAKEの定義済み推論規則
記述 意味
.asm.obj
$(AS) $(AFLAGS) /c$*.asm
.asm.exe
$(AS) $(AFLAGS) $*.asm
.bas.obj
$(BC) $(BFLAGS) $*.bas;
.c.obj
$(CC) $(CFLAGS) /c$*.c
.c.exe
$(CC) $(CFLAGS) $*.c
.for.obj
$(FOR) /c $(FFLAGS) $*.for
.for.exe
$(FOR) &(FFLAGS) $*.for
.rc.res
$(RC) $(RFLAGS) /r $*


NMAKEのﾃﾞｨﾚｸﾃｨﾌﾞ

3.4 ﾃﾞｨﾚｸﾃｨﾌﾞ

記述ﾌｧｲﾙでは、C言語のﾌﾟﾘﾌﾟﾛｾｯｻ用に類似のﾃﾞｨﾚｸﾃｨﾌﾞ(疑似命令)を使用できます。次表にﾃﾞｨﾚｸﾃｨﾌﾞを示します。各ﾃﾞｨﾚｸﾃｨﾌﾞは常に行の先頭から記述する必要がありますが、!の直後には空白を入れられます。
 ■
NMAKE記述ﾌｧｲﾙでのﾃﾞｨﾚｸﾃｨﾌﾞ (英字の大小は区別されず、!直後のｽﾍﾟｰｽ、ﾀﾌﾟは可)
ﾃﾞｨﾚｸﾃｨﾌﾞ 意味
!CMDS WITCHES{±opt…}
OPTはNMAKE起動時ｵﾌﾟｼｮﾝ(/D, /I, /N, /S)に対応するD, I, N, Sのいずれかで、直前に+(ON)または-(OFF)を付けて指定する。いずれも指定しない場合はNMAKE起動時の状態に戻す。この指定は、定義済みのﾏｸﾛMAKEFLAGSの内容に反映される。
!ELSE
条件が成立しない場合に処理すべき文の開始を表す。
!ENDIF
条件判断処理の範囲の最後を表す。
!ERROR text
textを表示してNMAKEの処理を中断する。
!IF condition
conditionを評価し、結果が真(0以外:条件成立)で、!ELSE(なければ!ENDIF)までの文を実行し、偽(0:条件不成立)で、!ELSEから!ENDIFまでの文を実行する。
!IFDEF name
ﾏｸﾛnameが定義済みならば条件成立とし、未定義ならば条件不成立として、!IFと同様の処理を行う。ﾇﾙ文字列でも定義済みと判断する。
!IFNDEF name
ﾏｸﾛnameが未定義ならば条件成立とし、未定義でなければ条件不成立として、!IFと同様の処理を行う。
!INCLUDE file
ｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘからﾌｧｲﾙfileを現在位置に読み込み、処理する。
!INCLUDE <file>
継承ﾏｸﾛINCLUDEで指定されるﾃﾞｨﾚｸﾄﾘからﾌｧｲﾙfileを現在位置に読み込み、処理する。INCLUDEは、NMAKE起動時に環境変数INCLUDEと同じ内容が設定される。
!UNDEF name
ﾏｸﾛnameを未定義にする。

!IFﾃﾞｨﾚｸﾃｨﾌﾞの条件式conditionには、以下のものが使用できます。
◆ | 整数定数 (C言語表記の10進数、16進数、8進数)
◆ | 文字列定数 (二重引用符で囲み、ﾏｸﾛ参照を含められる)
◆ | ﾌﾟﾛｸﾞﾗﾑ起動 ([ ]で囲む)
条件式には次表に示す演算子が使用可能です。また、==と!=は文字列にも適用できます。

 ■
!IFﾃﾞｨﾚｸﾃｨﾌﾞの条件式の演算子と優先順位 (ﾋﾞｯﾄごとのXORは^でなく^^に注意)
括弧の中
( )
最優先
単項演算子
- ~ !
ﾏｲﾅｽ符号、ﾋﾞｯﾄごとに否定、論理否定
2項演算子
* / %
乗算、除算、剰余
+ -
加算、減算
<< >>
左ｼﾌﾄ、右ｼﾌﾄ
< > <= >= == !=
大小比較、等しい、等しくない
&
ﾋﾞｯﾄごとのAND
^^
ﾋﾞｯﾄごとのXOR
|
ﾋﾞｯﾄごとのOR
&&
論理的AND
||
論理的OR


記述ﾌｧｲﾙの例

3.5 記述ﾌｧｲﾙの例

ﾌﾟﾛｸﾞﾗﾑがSAMPLE.ASMとDATA.ASMの2つのｿｰｽ･ﾌｧｲﾙから構成される場合の記述ﾌｧｲﾙの例を次に示します。これは、PWBで作成される記述の一例です。この記述ﾌｧｲﾙ名をSAMPLE.MAKとすると、NMAKE /F SAMPLE.MAKまたはNMAKE SAMPLE.MAKで起動できます。更に、記述ﾌｧｲﾙ名がMAKEFILEの場合は、NMAKEだけでも起動できます。

PROJ = SAMPLE
PROJFILE = SAMPLE.MAK
DEBUG = 0

PWBRMAKE = pwbrmake
NMAKEBSC1 = set
NMAKEBSC2 = nmake
ASM = ml
AFLAGS_G = /W2 /WX
AFLAGS_D = /Zi
AFLAGS_R = /nologo
MAPFILE_D = NUL
MAPFILE_R = NUL
LFLAGS_G = /NOI /BATCH
LFLAGS_D = /CO /FAR
LFLAGS_R = /EXE /FAR
LINKER = link
ILINK = ilink
LRF = echo > NUL
BROWSE = 0

OBJS = SAMPLE.obj DATA.obj
SBRS = SAMPLE.sbr DATA.sbr

all: $(PROJ).exe

.SUFFIXES:
.SUFFIXES: .sbr .obj .asm

SAMPLE.obj : SAMPLE.ASM

SAMPLE.sbr : SAMPLE.ASM

DATA.obj : DATA.ASM

DATA.sbr : DATA.ASM

$(PROJ).bsc : $(SBRS)
        $(PWBRMAKE) @<<
$(BRFLAGS) $(SBRS)
<<

$(PROJ).exe : $(OBJS)

!IF $(DEBUG)
        $(LRF) @<<$(PROJ).lrf
$(RT_OBJS: = +^
) $(OBJS: = +^
)
$@
$(MAPFILE_D)
$(LLIBS_G: = +^
) +
$(LLIBS_D: = +^
) +
$(LIBS: = +^
)
$(DEF_FILE) $(LFLAGS_G) $(LFLAGS_D):
<<
!ELSE
        $(LRF) @<<$(PROJ).lrf
$(RT_OBJS: = +^
) $(OBJS: = +^
)
$@
$(MAPFILE_R)
$(LLIBS_G: = +^
) +
$(LLIBS_R: = +^
) +
$(LIBS: = +^
)
$(DEF_FILE) $(LFLAGS_G) $(LFLAGS_R):
<<
!ENDIF
        $(LINKER) @$(PROJ).lrf

.asm.sbr :
!IF $(DEBUG)
        $(ASM) /Zs $(AFLAGS_G) $(AFLAGS_D) /FR$@ $<
!ELSE
        $(ASM) /Zs $(AFLAGS_G) $(AFLAGS_R) /FR$@ $<
!ENDIF

.asm.obj :
!IF $(DEBUG)
        $(ASM) /c $(AFLAGS_G) $(AFLAGS_D) /Fo$@ $<
!ELSE
        $(ASM) /c $(AFLAGS_G) $(AfLAGS_R) /Fo$@ $<
!ENDIF

run: $(PROJ).exe
        $(PROJ).exe $(RUNFLAGS)

debug: $(PROJ).exe
        CV $(CVFLAGS) $(PROJ).exe $(RUNFLAGS)


ﾌｧｲﾙT00LS.INI

3.6 ﾌｧｲﾙT00LS.INI

NMAKE起動時に、ﾌｧｲﾙTOOLS.INIを用いて初期設定が行なえます。このﾌｧｲﾙには、ﾏｸﾛ定義、疑似ﾀｰｹﾞｯﾄ.SUFFIXESによるﾌｧｲﾙ拡張子指定、更に推論規則を記述できます。ただし、これらの記述の先頭には、[NMAKE]と記述した行が必要です。

 ﾌｧｲﾙTOOLS.INIはｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘ、環境変数INITで指定されているﾃﾞｨﾚｸﾄﾘの順で検索されます。


LlBｺﾏﾝﾄﾞ

4. LlBｺﾏﾝﾄﾞ

ﾘﾝｸ時に使用するﾗｲﾌﾞﾗﾘの作成や変更を行なうためには、LIBｺﾏﾝﾄﾞを使用します。LIBｺﾏﾝﾄﾞでは、次のような処理が可能です。
◆ | ﾗｲﾌﾞﾗﾘに含まれるﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾞﾙとﾓｼﾞｭｰﾙのﾘｽﾄ
◆ | 新しいﾗｲﾌﾞﾗﾘの作成
◆ | 既存ﾗｲﾌﾟﾗﾘの更新
ﾗｲﾌﾞﾗﾘ内でのｵﾌﾞｼﾞｪｸﾄは、追加指定でのｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙのﾍﾞｰｽ名をもつﾓｼﾞｭｰﾙとなります。ﾓｼﾞｭｰﾙ名には、ﾄﾞﾗｲﾌﾞ名、ﾊﾟｽ名、拡張子は含められません。LIBの起動には、次表に示す項目を必要に応じて指定します。

 ■
commandsの指定内容 (複数指定可、順序は任意)
指定形式 意味
+object
ｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙをﾓｼﾞｭｰﾙとして追加
+library.LIB
ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙの全ﾓｼﾞｭｰﾙを追加
-module
ﾗｲﾌﾞﾗﾘからﾓｼﾞｭｰﾙを削除
-+object
ﾗｲﾌﾞﾗﾘのﾓｼﾞｭｰﾙを置換
*module
ﾓｼﾞｭｰﾙをｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙに複写
-*module
ﾓｼﾞｭｰﾙをｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙに複写して削除
注意: objectはｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ名、library.LIBはﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙ名で、拡張子.LIBは省略できません。これらにはﾄﾞﾗｲﾌﾞ名、ﾊﾟｽ名を含められます。moduleはﾗｲﾌﾞﾗﾘ内でのﾓｼﾞｭｰﾙ名で、複写ではﾓｼﾞｭｰﾙ名に拡張子.OBJを付加したﾌｧｲﾙ名で、作業ﾃﾞｨﾚｸﾄﾘにｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙが作成されます。
 ■
optionの指定内容 (英字の大文字と小文字の区別はない、紫色の文字を省略した省略形が使用可能)
形式(省略形) 意味
/PAGESIZE:nn
ﾍﾟｰｼﾞ･ｻｲｽﾞ(16～32768間の2のべき乗の値:16,32,64,…)を指定する。ﾃﾞﾌｫﾙﾄは16ﾊﾞｲﾄ。この値に65536(64KB)を乗じた値がﾗｲﾌﾞﾗﾘの最大ｻｲｽﾞとなる。
/IGNORECASE
ｼﾝﾎﾞﾙでの英字の大/小文字を区別しない。新規作成のﾃﾞﾌｫﾙﾄ。/NOI指定のﾗｲﾌﾞﾗﾘが含まれている場合のﾃﾞﾌｫﾙﾄ/NOIの変更にも用いる。
/NOEXTDICTIONARY
拡張辞書をﾗｲﾌﾞﾗﾘに作成しない。
/NOIGNORECASE
ｼﾝﾎﾞﾙでの英字大文字と小文字を区別する。この指定は、ﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙ中に記録される。

LIBの起動処理には、以下に述べる3つの方法があります。

 ① ｺﾏﾝﾄﾞ･ﾗｲﾝの指定形式
C:>LIB original_lib {option} {commands}{,list}{,newlib}{;}
original_libには、入力となるｵﾘｼﾞﾅﾙのﾗｲﾌﾞﾗﾘ名(*.LIB)を指定します。拡張子の.LIBは省略可能です。このﾗｲﾌﾞﾗﾘが存在しない場合、それ以降の指定内容によっては、新規作成の可否に答える必要があります。optionには、上記の表に示されているｵﾌﾟｼｮﾝを必要に応じて指定します。commandsには、同様に上記の表のいずれかの形式を、必要ならば複数続けて指定します。listは、ﾗｲﾌﾞﾗﾘに含まれるﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾞﾙとﾓｼﾞｭｰﾙのﾘｽﾄを出力するためのﾌｧｲﾙで、ﾄﾞﾗｲﾌﾞ名、ﾊﾟｽ名を含めた指定ができます。new_libは、出力となるﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙ名で、基本的にはcommandsによる操作のﾃﾞｽﾃｨﾈｰｼｮﾝを指定します。original_libが既存のﾌｧｲﾙで、newlibが省略された場合、original_libの名前が出力ﾌｧｲﾙに使用され、入力のｵﾘｼﾞﾅﾙ･ﾌｧｲﾙは拡張子が.BAKに変更されて保存されます。これらは、記述の順序が固定なので、前の項目を省略した場合、区切りのｶﾝﾏは省略できません。また、ｾﾐｺﾛﾝは指定の終わりを表わし、これ以後に記述された内容は無視されます。ｾﾐｺﾛﾝが入力されなかった場合、入力すべき項目が残っていれば、入力要求が行なわれます。

 ② 入カ要求に応答する形式
C:>LIB
LIBで起動し、次の入力要求に対して各々入力します。
Library name:original_lib {option}
Operations:commands
List file:list
Output library:new_lib
この場合、1行単位で入力すべき内容が指示されます。最初のﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙ名を除き、指定の必要がなければ、単に改行だけを入力します。それ以降の入力で指定が不要な場合は、直前の指定の改行の直前でｾﾐｺﾛﾝを入力します。複数のｺﾏﾝﾄﾞを指定する場合で、指定内容が複数行になるときは、1行の最後のｺﾏﾝﾄﾞ直後に&(ｱﾝﾊﾟｻﾝﾄﾞ)を入力して改行します。この結果、次の行に指定を続けられます。

 ③ 応答ﾌｧｲﾙを使用する形式
C:>LIB @filename
filenameは応答ﾌｧｲﾙの名前で、ﾄﾞﾗｲﾌﾞ名またはﾊﾟｽ名を含められます。応答ﾌｧｲﾙはﾃｷｽﾄ形式の内容で、上記①②のｺﾏﾝﾄﾞ･ﾗｲﾝの形式のどちらで記述可能です。また、ﾌｧｲﾙ名の入力可能な任意の位置で、これ以降の入力要求に対する応答内容を含む応答ﾌｧｲﾙの先頭に@(ｱｯﾄﾏｰｸ)を付加して指定することも可能です。


ILINKｺﾏﾝﾄﾞ

5. ILINKｺﾏﾝﾄﾞ

ﾌﾟﾛｸﾞﾗﾑやﾀﾞｲﾅﾐｯｸ･ﾘﾝｸ･ﾗｲﾌﾞﾗﾘのﾘﾝｸでは、ある一定の条件を満たしているとき、変更が生じた場合に変更部分だけの処理で済ませられます。これをｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸと呼び、ﾘﾝｸ処理が短時間で行なえます。ただし、ｽﾓｰﾙ･ﾓﾃﾞﾙやｺﾝﾊﾟｸﾄ･ﾓﾃﾞﾙなどのように、ｺｰﾄﾞが1個のｾｸﾞﾒﾝﾄで構成されている場合には、あまり効果はありません。従って、これ以外のﾒﾓﾘ･ﾓﾃﾞﾙのﾌﾟﾛｸﾞﾗﾑやﾀﾞｲﾅﾐｯｸ･ﾘﾝｸ･ﾗｲﾌﾞﾗﾘの作成で、主に複数のｾｸﾞﾒﾝﾄやﾓｼﾞｭｰﾙが存在する場合に、ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸが利用されます。ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｶの処理構造を以下に示します。実際の処理で、ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｶの処理機能を越えた場合には、ﾘﾝｶ(LINK)が自動的に呼び出されます。
 ■
ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｶの処理構造 (projectは、処理対象の実行形式ﾌｧｲﾙまたはﾀﾞﾅﾐｯｸ･ﾘﾝｸ･ﾗｲﾌﾟﾗﾘのﾍﾞ-ｽ名)
① | 変更部分のｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙは複数ﾌｧｲﾙが可能です。
② | LINKはﾘﾝｸ処理を最初から実行する必要がある場合にILINKによって呼び出されます。

 ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｶを起動するためには、次の形式を使用します。
C:>ILINK {option} project {module module …}
projectは、対象となる実行形式のﾌｧｲﾙ名で、拡張子.EXEは省略できます。moduleには、変更の生じたﾓｼﾞｭｰﾙのﾌｧｲﾙ名を指定しますが、拡張子は不要です。これは、起動時ｵﾌﾟｼｮﾝ/aの代わりに使用され、省略可能です。また、optionには次表に示すｵﾌﾟｼｮﾝを必要に応じて指定します。
 ■
ILINKｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ (英字の大小は区別されない)
ｵﾌﾟｼｮﾝ 意味
/a
関連するすべてのｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ(*.OBJ)の変更日時を、対象となる実行形式ﾌｧｲﾙと比較して、変更のあるﾓｼﾞｭｰﾙをすべて使用します。(ｺﾏﾝﾄﾞ･ﾗｲﾝでﾓｼﾞｭｰﾙを指定しない場合と同等)
/c
ﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾞﾙの大文字と小文字を区別します。
/e "commands"
ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸで正常に処理できなかった場合に実行するｺﾏﾝﾄﾞを指定します。ｺﾏﾝﾄﾞは""で囲み、複数指定する場合はｾﾐｺﾛﾝで区切ります。なお、文字列の%sは、起動時に指定されたprojectで置換されます。 [ﾃﾞﾌｫﾙﾄ:/e "LINK @$s.lnk"]
/I
ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸの機能で正常に処理できなかった場合にLINKを呼び出し、0以外の終了ｺｰﾄﾞを返します。
/v
変更の生じたﾓｼﾞｭｰﾙに関する詳細な情報を表示します。
/x
拡張ﾒﾓﾘ(XMS)の使用を禁止します。

以下に、ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸに必要な条件を示します。ただし、MS-DOSでｵｰﾊﾞﾚｲを用いているﾌﾟﾛｸﾞﾗﾑは処理できません。
◆ | ﾘﾝｸに使用しているﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙを変更しません。
◆ | 他のﾓｼﾞｭｰﾙから参照されているｺｰﾄﾞのｼﾝﾎﾞﾙを削除しません。ただし、ﾓｼﾞｭｰﾙ内での移動や新しいｺｰﾄﾞのｼﾝﾎﾞﾙの追加は許されます。
◆ | 他のﾓｼﾞｭｰﾙから参照されているﾃﾞｰﾀのｼﾝﾎﾞﾙを移動または削除しません。新しいﾃﾞｰﾀのｼﾝﾎﾞﾙは追加できますが、共有ﾃﾞｰﾀのｼﾝﾎﾞﾙは追加できません。
この条件がすべて満たされない場合は、最初からﾘﾝｸ処理を行う必要があります。次に、ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｸの処理手順を示します。
① | LINKｺﾏﾝﾄﾞ起動時に、/INCREMENTAL, /PADCODE:nn, /PADDATA:nnのｵﾌﾟｼｮﾝを指定して、ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｶ用の付加情報ﾌｧｲﾙ(*.ILKと*.SYM)の作成と、ｺｰﾄﾞとﾃﾞｰﾀのﾓｼﾞｭｰﾙの拡張に対して余裕のある空き領域(ﾊﾟｯﾄﾞ)を作成します。
② | 生じた変更が制限範囲内の場合は、ILINKを繰り返し使用します。
③ | 制限を越えるような変更が生じた場合は、手順①から行います。
ｲﾝｸﾘﾒﾝﾀﾙ･ﾘﾝｶは、起動されると以下の処理内容を行います。
① | 変更のあったﾓｼﾞｭｰﾙだけを新しい内容と置き換えます。
② | 実行形式ﾌｧｲﾙのﾍｯﾀﾞに含まれるﾘﾛｹｰｼｮﾝ･ﾃｰﾌﾞﾙの必要なｴﾝﾄﾘを修正します。
ただし、以下の状況が発生するとLINKを呼び出して、LINKによる最初からのﾘﾝｸ処理を依頼します。なお、本当のﾘﾝｸ･ｴﾗｰが発生した場合は、ｴﾗｰ･ﾒｯｾｰｼﾞを出力します。
◆ | ﾗｲﾌﾞﾗﾘが変更されている場合、または、変更されたﾓｼﾞｭｰﾙに、ﾗｲﾌﾞﾗﾘと共有のｺｰﾄﾞ･ｾｸﾞﾒﾝﾄが含まれている場合(ﾗｲﾌﾞﾗﾘにｱｸｾｽする必要が生じた場合)。
◆ | ｺｰﾄﾞまたはﾃﾞｰﾀの余裕領域(ﾊﾟｯﾄﾞ)に不足が生じた場合。
◆ | 他のﾓｼﾞｭｰﾙから参照されているｺｰﾄﾞのｼﾝﾎﾞﾙを削除または異なるﾓｼﾞｭｰﾙに移動した場合。
◆ | 他のﾓｼﾞｭｰﾙから参照されているﾃﾞｰﾀのｼﾝﾎﾞﾙを移動または削除した場合。
◆ | ｾｸﾞﾒﾝﾄ定義またはｸﾞﾙｰﾌﾟ定義に変更が生じた場合。


BlNDｺﾏﾝﾄﾞ

6. BlNDｺﾏﾝﾄﾞ

BINDは、0S/2のﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞとMS-DOSと互換性のあるﾘｱﾙ･ﾓｰﾄﾞの両ﾓｰﾄﾞで動作する実行形式ﾌｧｲﾙを作成するために使用します。BINDは、ﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞ用の実行形式ﾌｧｲﾙを両ﾓｰﾄﾞ用に変換します。

 このｺﾏﾝﾄﾞは、次の形式で起動します。MLｺﾏﾝﾄﾞでｵﾌﾟｼｮﾝ/Fbを指定しても、両ﾓｰﾄﾞ用のﾌﾟﾛｸﾞﾗﾑを作成できます。
C:>BIND file {import_lib} {link_lib} {option}
fileはﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞのﾌﾟﾛｸﾞﾗﾑ･ﾌｧｲﾙ名(*.EXE)を指定します。import_libはｲﾝﾎﾟｰﾄ･ﾗｲﾌﾞﾗﾘ･ﾌｧｨﾙ名を、link_libは標準ﾗｲﾌﾞﾗﾘ名またはｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙ名を指定しますが、ともに複数ﾌｧｲﾙ名が指定可能です。optionは次表に示す内容を必要に応じて指定します。これも複数指定が可能です。

 ■
BlNDｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ (英字の大文字と小文字の区別はない、紫色の文字を省略した省略形が使用可能)
option 意味
/MAP {file}
ﾏｯﾌﾟﾌｧｲﾙの作成指定
/NAME func
ﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞだけで使用する関数ﾘｽﾄ (複数の場合はｽﾍﾟｰｽで区切る)
/NAME @file
ﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞだけで使用する関数ﾘｽﾄを含むﾌｧｲﾙの指定
/NOLOGO
起動時のﾛｺﾞ表示の抑制
/OUTFILE file
ﾊﾞｲﾝﾄﾞ後の出力ﾌｧｲﾙの指定


CV(CVP)ｺﾏﾝﾄﾞ

7. CV(CVP)ｺﾏﾝﾄﾞ

CodeViewはｳｲﾝﾄﾞｳ指向のｿｰｽ･ﾚﾍﾞﾙのﾃﾞﾊﾞｯｶﾞです。CodeViewは起動時に、環境変数INITで指定されるﾃﾞｨﾚｸﾄﾘに含まれるﾌｧｲﾙTOOLS.INIを読み込み、初期設定を行ないます。OS/2のﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞでは、CVPｺﾏﾝﾄﾞを使用します。CVｺﾏﾝﾄﾞは次の形式で起動します。
C:>CV {option} file {parameter}
optionは次表に示す内容を必要に応じて指定します。複数指定が可能です。fileは実行形式ﾌｧｲﾙ名を指定します。拡張子.EXEは省略可能ですが、.COMは省略不可です。parameterは、ﾃﾞﾊﾞｯｸﾞ対象のﾌﾟﾛｸﾞﾗﾑに渡すﾊﾟﾗﾒｰﾀを必要に応じて指定します。

 ■
CVｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ (英字の大文字と小文字の区別はない)
option 意味
/B
表示画面を白黒ﾓｰﾄﾞで起動
"/Command"
起動後に実行するｺﾏﾝﾄﾞcommandの指定 (複数を指定する場合はｾﾐｺﾛﾝで区切る。特殊文字を含まなければ引用符は不要、引用符は\"で指定)
/D{nn}
ﾃﾞｨｽｸ･ｵｰﾊﾞﾚｲ･ﾊﾞｯﾌｧのｻｲｽﾞ(単位はKﾊﾞｲﾄ)を指定 (MS-DOS用:nnを省略時は/D64を仮定、最大は128)
/E
EMSを使用 (通常は自動的に使用するので指定は不要)
/F
MS-DOSで、ﾃｷｽﾄ表示の切り替えをﾌﾘｯﾌﾟに指定 (ﾃﾞﾌｫﾙﾄ)
/I
MS-DOSで、8259のｲﾝﾀﾗﾌﾟﾄのﾄﾗｯﾌﾟをｵﾌの設定
/K
ｷｰﾎﾞｰﾄﾞからの割り込みを無視
/Llibrary
ﾀﾞｲﾅﾐｯｸ･ﾘﾝｸ･ﾗｲﾌﾞﾗﾘのｼﾝﾎﾞﾙ情報の利用
/M
CVでのﾏｳｽ使用の禁止 (ﾃﾞﾊﾞｯｸﾞ対象のﾌﾟﾛｸﾞﾗﾑがﾏｳｽを使用する場合)
/O
OS/2でのﾏﾙﾁﾌﾟﾛｾｯｻのﾃﾞﾊﾞｯｸﾞ
/R
MS-DOSでの80386/80486のﾃﾞﾊﾞｯｸﾞ･ﾚｼﾞｽﾀの利用
/S
MS-DOSで、ﾃｷｽﾄ表示画面の切り替えをﾌﾘｯﾌﾟの指定 (ｸﾞﾗﾌｨｯｸ使用のﾌﾟﾛｸﾞﾗﾑのﾃﾞﾊﾞｯｸﾞ)
/TSF
CURRENT.STSの読み込みの制御
/X
XMSを使用 (通常は自動的に使用するので指定は不要)

CVを使用するための条件を次に示します。

 ■ ﾏｳｽの利用

 ﾃﾞﾊﾞｯｸﾞ時にﾏｳｽを利用する場合、以下の点に注意する必要があります。

MSｰDOS | ﾊﾟｯｹｰｼﾞに含まれているﾃﾞﾊﾞｲｽ･ﾄﾞﾗｲﾊﾞを登録します。他のものは、使用できない可能性があります。
0S/2 | ﾘｱﾙ･ﾓｰﾄﾞでﾏｳｽを利用する場合、OS/2に標準で含まれているﾃﾞﾊﾞｲｽ･ﾄﾞﾗｲﾊﾞ(MOUSE01.SYS、POINTDD.SYS)を登録できません。これらをCONFIG.SYSから削除して、ﾊﾟｯｹｰｼﾞに含まれているものを登録してください。ﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞの場合、OS/2に標準で含まれているﾃﾞﾊﾞｲｽ･ﾄﾞﾗｲﾊﾞ(MOUSE01.SYS、POINTDD.SYS)を登録すれば、ﾏｳｽを利用できます。

 ■ ﾃﾞﾊﾞｯｸ情報を含む実行形式ﾌｧｲﾙの作成

MLｺﾏﾝﾄﾞでのｱｾﾝﾌﾞﾙ時に、ｵﾌﾟｼｮﾝ/Ziを指定します。この指定で、ｼﾝﾎﾞﾙ情報を含むｵﾌﾞｼﾞｪｸﾄ･ﾌｧｲﾙが作成され、それに続くﾘﾝｸ処理でｵﾌﾟｼｮﾝ/COが指定されて、ﾃﾞﾊﾞｯｸﾞ用の実行形式ﾌｧｲﾙが作成されます。以後は、ｿｰｽ･ﾌｧｲﾙ(複数可)と実行形式ﾌｧｲﾙを用いてﾃﾞﾊﾞｯｸﾞが可能となります。COM形式(TINYﾒﾓﾘ･ﾓﾃﾞﾙ)の場合は、ﾘﾝｸ時に作成されるﾃﾞﾊﾞｯｸﾞ情報ﾌｧｲﾙ(*.DBG)も必要です。

 ■ その他の注意事項

 日本語入力変換用のFEPが組込まれた状態で使用する場合、画面が正常に表示されないときは、起動時ｵﾌﾟｼｮﾝ/Sを指定すれば避けられます。80386/80486などで、仮想8086ﾓｰﾄﾞを利用したEMSを用いている場合は、32ﾋﾞｯﾄ･ﾚｼﾞｽﾀを表示できません。Breakｷｰは、CVが使用しているため、ﾌﾟﾛｸﾞﾗﾑでは利用できません。また、MS-D0SのﾕｰﾃｨﾘﾃｨPRINTを使用している状態では、ﾏｳｽの利用に制約が生じる場合があります。


CVPACKｺﾏﾝﾄﾞ

8. CVPACKｺﾏﾝﾄﾞ

実行形式ﾌｧｲﾙ(*.EXE)に含まれるﾃﾞﾊﾞｯｸﾞ情報を圧縮し、ﾌｧｲﾙ･ｻｲｽﾞを縮小します。/Pは、最大限の圧縮を行なう場合に指定します。fileは、ﾃﾞﾊﾞｯｸﾞ対象の実行形式ﾌｧｲﾙ(*.EXE)です。ﾃﾞﾊﾞｯｸﾞ情報を含まない実行形式ﾌｧｲﾙには使用できません。CVPACKｺﾏﾝﾄﾞは次の形式で起動します。
C:>CVPACK {/P} file


EXEHDRｺﾏﾝﾄﾞ

9. EXEHDRｺﾏﾝﾄﾞ

実行形式ﾌｧｲﾙ(*.EXE)のﾍｯﾀﾞ情報の表示または変更を行ないます。optionは次表に示す内容を必要に応じて指定します。複数指定が可能です。fileは対象とする実行形式ﾌｧｲﾙ名(*.EXE)を指定します。EXEHDRｺﾏﾝﾄﾞは次の形式で起動します。
C:>EXEHDR {option} file
■ EXEHDRｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ
option 意味
/HEAP:nn
ﾛｰｶﾙ･ﾋｰﾌﾟ割り当てﾌｨｰﾙﾄﾞをnnに変更 (OS/2)
/MAX:nn
最大割り当てﾌｨｰﾙﾄﾞをnn(ﾊﾟﾗｸﾞﾗﾌ)に変更
/MIN:nn
最小割り当てﾌｨｰﾙﾄﾞをnn(ﾊﾟﾗｸﾞﾗﾌ)に変更
/NEWFILES
長いﾌｧｲﾙ名のｻﾎﾟ-ﾄ (OS/2)
/N0L0G0
起動時のﾛｺﾞ表示の抑制
/PMTYPE:type
ﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞ･ﾌﾟﾛｸﾞﾗﾑのｳｲﾝﾄﾞｳ･ﾀｲﾌﾟを指定 (OS/2)
/RESETERROR
ｴﾗｰ･ﾋﾞｯﾄのﾘｾｯﾄ (OS/2)
/STACK:nn
ｽﾀｯｸ割り当てﾌｨｰﾙﾄﾞをnn(ﾊﾞｲﾄ)に変更
/VERBOSE
詳細情報の表示


H2INCｺﾏﾝﾄﾞ

10. H2INCｺﾏﾝﾄﾞ

このｺﾏﾝﾄﾞは、C言語のｺﾝﾊﾟｲﾗ(MSC Ver.6.0)用のﾍｯﾀﾞ･ﾌｧｲﾙを、ﾏｸﾛｱｾﾝﾌﾞﾗに互換性のあるｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙに変換します。変換対象は、ﾃﾞｰﾀや型の定義、関数のﾌﾟﾛﾄﾀｲﾌﾟ宣言です。次にH2lNCｺﾏﾝﾄﾞの起動形式を示します。
C:>H2INC {option} file
fileは拡張子.Hの入力ﾌｧｲﾙ名で、変換後の出力ﾌｧｲﾙの拡張子は.INCになります。optionは次表に示す内容を必要に応じて指定します。複数指定が可能です。

 ■
H2INCｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ (英字の大小が区別される)
option 意味
/C
ｺﾒﾝﾄを保存する。
/Fa file
出力ﾌｧｲﾙ名を指定する。
/Fc {file}
出力ﾌｧｲﾙにﾍｯﾀﾞ･ﾌｧｲﾙの内容を注釈として含める。
/Ht
ﾃｷｽﾄ等価記号を生成する。
/Mn
ﾒﾓﾘ･ﾓﾃﾞﾙとは関係なく、距離属性を明示的に宣言する。
/Ni
ｲﾝｸﾙｰﾄﾞ･ﾌｧｲﾙのﾈｽﾄを無視する。
/Tc file
拡張子.H以外のﾌｧｨﾙを処理する。
/Znstr
生成される名前にすべてstrを付加する。
/Zu
すべての構造体と共用体のﾀｸﾞ名を一意なものにする。

Cｺﾝﾊﾟｲﾗのｵﾌﾟｼｮﾝの一部もｻﾎﾟｰﾄされていて、起動時に指定可能です。更に、環境変数CLの設定内容も処理時に参照されます。型の変換では、C言語のsignedとunsignedを考慮して処理されます。また、ｵﾌﾟｼｮﾝ/G3または/G4が指定されていると。intのｻｲｽﾞは4ﾊﾞｲﾄが仮定されます。変換されるﾍｯﾀﾞ･ﾌｧｲﾙ内では、C言語のｺﾝﾊﾟｲﾙ処理時と同様に、次表の定数名が参照可能です。
 ■
ﾍｯﾀﾞ･ﾌｧｲﾙ内で参照可能な定数名
定数名 定義条件
_H2INC
常に定義 (H2INCでの処理)
M_186
常に定義 (8086系のﾌﾟﾛｾｯｻ)
MSDOS
常に定義 (MSｰDOSのOS)
_MSC_VER
現ﾊﾞ-ｼﾞｮﾝで、内容は600で常に定義 (MSCのﾊﾞｰｼﾞｮﾝ)
M_I8086
/G0を指定 (8086を使用) [ﾃﾞﾌｫﾙﾄ]
M_I286
/G1,/G2,/G3のいずれかを指定 (上位ﾌﾟﾛｾｯｻ)
NO_EXT_KEYS
/Zaを指定 (拡張ｷ-ﾜｰﾄﾞは無効)
_CHAR_UNSIGNED
/Jを指定 (cahr型は符号なし)
M_I86SM
/ASを指定 (ｽﾓｰﾙ･ﾓﾃﾞﾙ) [ﾃﾞﾌｫﾙﾄ]
M_I86MM
/AMを指定 (ﾐﾃﾞｨｱﾑ･ﾓﾃﾞﾙ)
M_I86CM
/ACを指定 (ｺﾝﾊﾟｸﾄ･ﾓﾃﾞﾙ)
M_I86LM
/ALを指定 (ﾗｰｼﾞ･ﾓﾃﾞﾙ)
M_I86HM
/AHを指定 (ﾋｭ-ｼﾞ･ﾓﾃﾞﾙ)


lMPLlBｺﾏﾝﾄﾞ

11. lMPLlBｺﾏﾝﾄﾞ

これは、OS/2のﾌﾟﾛﾃｸﾄ･ﾓｰﾄﾞで用いるｲﾝﾎﾟｰﾄ･ﾗｲﾌﾞﾗﾘの作成に使用します。次にlMPLlBｺﾏﾝﾄﾞの起動形式を示します。
C:>IMPLIB {option} lib file
libは作成するｲﾝﾎﾟｰﾄ･ﾗｲﾌﾞﾗﾘの名前です。optionには、次表のｵﾌﾟｼｮﾝを指定します。fileは、ﾀﾞｲﾅﾐｯｸ･ﾘﾝｸ･ﾗｲﾌﾞﾗﾘ作成時のﾓｼﾞｭｰﾙ定義ﾌｧｲﾙまたはﾀﾞｲﾅﾐｯｸ･ﾘﾝｸ･ﾗｲﾌﾞﾗﾘで、複数を指定することが可能です。これらから1個のﾗｲﾌﾞﾗﾘ･ﾌｧｲﾙが作成されます。
■ lMPLlBｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ
option 意味
/N0lGN0RECASE
ｴﾝﾄﾘ名の英字の大小を区別する。
/N0L0G0
起動時のﾛｺﾞを表示しない。


PWBｺﾏﾝﾄﾞ

12. PWBｺﾏﾝﾄﾞ

PWB(Programmer's WorkBench)は、ｴﾃﾞｨﾀ機能をもつﾌﾟﾛｸﾞﾗﾑ開発用の統合環境です。PWBは起動時に、環境変数INITで指定されるﾃﾞｨﾚｸﾄﾘに含まれるﾌｧｲﾙTOOLS.INIを読み込み、初期設定を行ないます。また、PWBの終了時には、現在の設定状況を、環境変数INITで指定されるﾃﾞｨﾚｸﾄﾘにﾌｧｲﾙCURRENT.STSとして保存します。このﾌｧｲﾙCURRENT.STSは、起動時に参照され、ﾌｧｲﾙTOOLS.INIよりも優先されます。PWBは次の形式で起動します。
C:>PWB {option} {file}
optionは次表に示す内容を必要に応じて指定します。複数指定が可能です。fileは操作対象とするﾌｧｲﾙ名を指定します。これも複数指定が可能です。PWB起動後は、簡単なｷｰ操作で各種のﾍﾙﾌﾟ情報が表示されます。また、ﾏｳｽを利用することも可能で、ｺﾝﾊﾟｲﾗやﾘﾝｶの起動、ﾌﾟﾛｸﾞﾗﾑの実行やﾃﾞﾊﾞｯｸﾞなども容易に行なえます。ただし、PWB自身の動作の関係で、いくつかの制約が存在します。
■ PWBｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ
option 意味
/D {x}
xは以下の文字の組み合わせ (x省略時はすべて指定)
T
TOOLS.INIを無視
S
CURRENTS.STSを無視
A
拡張機能を自動的にﾛｰﾄﾞしない
/e"command"
起動的に処理するPWBｺﾏﾝﾄﾞを指定
/m MARK
ｶｰｿﾙを指定、MARK位置に移動
/PF file
指定ﾒｲｸ･ﾌｧｲﾙを登録
/PL
直前に作成したﾌﾟﾛｸﾞﾗﾑ･ﾘｽﾄを読み込む
/PP file
指定のﾌﾞﾛｸﾞﾗﾑ･ﾘｽﾄを読み込む
/r
ﾌｧｲﾙをﾘｰﾄﾞ･ｵﾝﾘｰ･ﾓｰﾄﾞで処理
/t file
ﾛｰﾄﾞする一時ﾌｧｲﾙを指定 (複数可) [ｵﾌﾟｼｮﾝの最後に指定]


PWBRMAKEｺﾏﾝﾄﾞ

13. PWBRMAKEｺﾏﾝﾄﾞ

PWBでは、ﾓｼﾞｭｰﾙ間のｼﾝﾎﾞﾙの定義や参照のﾘｽﾄ、手続き呼び出しの関係ﾘｽﾄが得られます。このﾘｽﾄ作成のために、PWBRMAKEｺﾏﾝﾄﾞが存在します。PWBRMAKEｺﾏﾝﾄﾞは、ｱｾﾝﾌﾞﾙの起動ｵﾌﾟｼｮﾝ/FRまたは/Frの指定で作成されるｿｰｽ･ﾌﾞﾗｳｻﾞ･ﾃﾞｰﾀﾍﾞｰｽ(*.SBR)を、PWBで利用可能なﾃﾞｰﾀﾍﾞｰｽ･ﾌｧｲﾙ(*.BSC)に変換します。

 このｺﾏﾝﾄﾞは、単独で使用することも可能ですが、通常はPWB内で使用されます。また、PWB内の使用はﾒﾆｭｰで指定するだけで、必要に応じて自動的にﾃﾞｰﾀﾍﾞｰｽ･ﾌｧｲﾙが更新されます。PWBRMAKEｺﾏﾝﾄﾞを単独で使用する場合はｵﾝﾗｲﾝ･ﾍﾙﾌﾟを参照してください。


QHｺﾏﾝﾄﾞ

14. QHｺﾏﾝﾄﾞ

各種ｺﾏﾝﾄﾞの使用法や、ｱｾﾝﾌﾞﾘ言語のｷｰﾜｰﾄﾞなどの詳細を得るためのﾕｰﾃｨﾘﾃｨです。PWBなどと同様に、環境変数HELPFILESで指定されているﾍﾙﾌﾟ･ﾌｧｲﾙを参照して、必要な情報を画面に表示します。QHｺﾏﾝﾄﾞの使用法はPWBｺﾏﾝﾄﾞと同様で、ﾏｳｽが利用可能ですが、更に独自の便利な使い方ができます。詳細は、QHｺﾏﾝﾄﾞ自身を起動して、ｵﾝﾗｲﾝ･ﾍﾙﾌﾟを参照してください。


HELPMAKEｺﾏﾝﾄﾞ

15. HELPMAKEｺﾏﾝﾄﾞ

HELPMAKEｺﾏﾝﾄﾞは、ｵﾝﾗｲﾝ･ﾍﾙﾌﾟで用いるﾍﾙﾌﾟ･ﾌｧｲﾙのｴﾝｺｰﾄﾞ(変換)とﾃﾞｺｰﾄﾞ(復元)の処理を行ないます。ﾍﾙﾌﾟ･ﾌｧｲﾙは、ｱｸｾｽの効率とｻｲｽﾞの関係から、圧縮された特殊な形式になっています。HELPMAKEｺﾏﾝﾄﾞの詳細は、ｵﾝﾗｲﾝ･ﾍﾙﾌﾟを参照してください。


MASMｺﾏﾝﾄﾞ

16. MASMｺﾏﾝﾄﾞ

以前のﾊﾞｰｼﾞｮﾝからの移行で、既存のﾊﾞｯﾁ･ﾌｧｲﾙやﾒｲｸ･ﾌｧｲﾙの変更を避けるためには、MASMｺﾏﾝﾄﾞを使用できます。ただし、入力要求に応答する方法はｻﾎﾟｰﾄされていません。また、完全な互換性がある訳ではなく、場合によってはｿｰｽ･ﾌｧｲﾙ自身も変更する必要性が生じます。

 このMASMｺﾏﾝﾄﾞは、環境変数MASMの指定とｺﾏﾝﾄﾞ･ﾗｲﾝで指定されたｵﾌﾟｼｮﾝやﾌｧｲﾙ名を必要に応じて変換し、ｵﾌﾟｼｮﾝ/Zmと/cを付加してｺﾏﾝﾄﾞMLに渡します。この結果、ｱｾﾝﾌﾞﾙ処理だけが行なわれます。次表にMASMｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝを示します。

 ■
MASMｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ (英字の大小は区別されない)
ｵﾌﾟｼｮﾝ 処理 備考
/A
警告(ｻﾎﾟｰﾄしていない)。 .ALPHAで代用可
/C
/FRに変換する。
/D
/FI /Sfに変換する。
/Dname{=string}
変換しない。
/E
/FPiに変換する。
/H
/helpに変換する。
/Ipath
変換しない。
/L
/Flに変換する。
/LA
/Fl /Saに変換する。
/ML
/Cpに変換する。
/MU
/Cuに変換する。
/MX
/Cxに変換する。
/N
/Snに変換する。
/P
無視(ｻﾎﾟ-ﾄしていない)。 0PTl0N文を参照
/S
警告(ｻﾎﾟｰﾄしていない)。 .SEQ文で代用可
/T
/nologoに変換する。
/V
無視(ｻﾎﾟｰﾄしていない)。
/Wn
変換しない(n=0～2)。
/X
/Sxに変換する。
/Z
無視(ｻﾎﾟｰﾄしていない)。
/ZD
/Zdに変換する。
/ZI
/Ziに変換する。


EXP,RM,UNDELｺﾏﾝﾄﾞ

17. EXP,RM,UNDELｺﾏﾝﾄﾞ

PWBでは、DIRｺﾏﾝﾄﾞでは表示されない隠しｻﾌﾞﾃﾞｲﾚｸﾄﾘ(ﾃﾞｲﾚｸﾄﾘ名は"DELETED")を用いて、修正前のﾌｧｲﾙ内容の保存･管理を行います。このﾃﾞｨﾚｸﾄﾘに対するﾌｧｲﾙ操作のために、以下のｺﾏﾝﾄﾞが使用できます。

 ■ EXPｺﾏﾝﾄﾞ

 指定の隠しｻﾌﾞﾃﾞｨﾚｸﾄﾘに含まれるﾌｧｲﾙを、すべて消去する場合に使用します。次に起動形式を示します。
C:>EXP {option} {path}
optionは次表を参照して下さい。pathは隠しｻﾌﾞﾃﾞｨﾚｸﾄﾘの親ﾃﾞｨﾚｸﾄﾘを指定します。省略時はｶﾚﾝﾄ･ﾃﾞｨﾚｸﾄﾘとなります。
■ EXPｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ
option 意味
/Q
削除ﾌｧｲﾙ名を表示しない。
/R
指定ﾃﾞｨﾚｸﾄﾘに属するすべてのｻﾌﾞﾃｨﾚｸﾄﾘに対して、再帰的に削除を実行する。

■ RMｺﾏﾝﾄﾞ

 指定したﾌｧｲﾙを、隠しｻﾌﾞﾃﾞｨﾚｸﾄﾘに移動(複写して削除)する場合に使用します。次に起動形式を示します。
C:>RM {option} file
optionは次表を参照して下さい。fileは隠しｻﾌﾞﾃﾞｨﾚｸﾄﾘに移動するﾌｧｲﾙ名を指定します。ﾌｧｲﾙ名にはﾜｲﾙﾄﾞ･ｶｰﾄﾞが使用可能です。
■ RMｺﾏﾝﾄﾞのｵﾌﾟｼｮﾝ (小文字のみ)
option 意味
/f
読み出し専用ﾌｧｲﾙであっても無条件に削除する。
/I
削除前に確認を求める。
/k
読み出し専用ﾌｧｲﾙは削除しない。
/r path
指定したｻﾌﾞﾃﾞｨﾚｸﾄﾘに対して、再帰的に移動を実行する。

■ UNDELｺﾏﾝﾄﾞ

 隠しｻﾌﾞﾃﾞｨﾚｸﾄﾘに存在する指定のﾌｧｲﾙを、その親ﾃﾞｨﾚｸﾄﾘに移動する場合に使用します。次に起動形式を示します。
C:>UNDEL {/HELP} {file {file…}}
同名のﾌｧｲﾙが親ﾃﾞｨﾚｸﾄﾘに存在するときは、両者を入れ替えます。fileは、親ﾃﾞｨﾚｸﾄﾘに移動するﾌｧｲﾙ(複数指定可能)です。省略時は隠しｻﾌﾞﾃﾞｨﾚｸﾄﾘの内容を表示します。


補足目次

§3 補足目次

1. ｱｾﾝﾌﾞﾗの制限
2. MASM Ver5.1との対応


ｱｾﾝﾌﾞﾗの制限

1. ｱｾﾝﾌﾞﾗの制限

ｱｾﾝﾌﾞﾗには以下の制限事項があります。

項目 | 制限
文(論理行)の長さ | 最大512文字
ｼﾝﾎﾞﾙの有効な長さ | 最大247文字
ﾏｸﾛ･ﾌﾟﾛｼｰｼﾞｬのﾈｽﾄ | 最高40ﾚﾍﾞﾙ
ﾏｸﾛ関数のﾈｽﾄ | 最高40ﾚﾍﾞﾙ
ﾃｷｽﾄ･ﾏｸﾛのﾈｽﾄ | 最高20ﾚﾍﾞﾙ
IFﾌﾞﾛｯｸのﾈｽﾄ | 最大20ﾚﾍﾞﾙ
PUSHCONTEXT文とPOPCONTEXT文による状態保存のﾈｽﾄ | 最大10ﾚﾍﾞﾙ


MASM Ver5.1との対応

2. MASM Ver5.1との対応

■ 名称変更

 前ﾊﾞｰｼﾞｮﾝの一部の擬似命令(ﾃﾞｨﾚｸﾃｨﾌﾞ)は、他の言語との一貫性を高めるために、名称変更されたものがあります。現ﾊﾞｰｼﾞｮﾝでは以前の名前もｻﾎﾟｰﾄされています。今後のﾊﾞｰｼﾞｮﾝでは保証されませんので、新規作成では新しい名前を使用して下さい。
■ Ver6.0での名称変更一覧
Ver 6.0 Ver 5.1 備考
BYTE
DB
符号付き整数や実数などの属性がｻﾎﾟｰﾄされた。
SBYTE
DB
W0RD
DW
SWORD
DW
DW0RD
DD
SDW0RD
DD
FW0RD
DF
QW0RD
DQ
TBYTE
DT
REAL4
DD
REAL8
DO
REAL10
DT
EXTERN
EXTRN
EXTRNDEF
EXTRN
STRUCT
STRUC
REPEAT
REPT
F0R
IRP
F0RC
IRPC
0PATTR
.TYPE
0PATTRでの下位ﾊﾞｲﾄが、.TYPEに等価。
SUBTlTLE
SUBTTL
.NOLlST
.XLlST
.N0LlSTMACRO
.SALL
.LlSTMACR0
.XALL
.LlSTMACROALL
.LALL
.LlSTIF
.LFCOND
.NOLlSTIF
.SFCOND
.N0CREF
.XCREF
ECH0
%OUT
.DOSSEG
D0SSEG
.286
.286C
.386
.386C

IF1
ｱｾﾝﾌﾞﾙ処理に2ﾊﾟｽ方式を用いなくなったため、ﾊﾟｽ依存の文は使用できない。

IF2

ELSEIF1

ELSEIF2

.ERR1

.ERR2

.MSFL0AT
ﾏｲｸﾛｿﾌﾄ形式の浮動小数点は使用不可。

■ ｿｰｽ･ﾌｧｲﾙの変更

 処理方式が変更されたために、次のような状況ではｿｰｽ･ﾌﾟﾛｸﾞﾗﾑを変更する必要性の生じる場合があります。
◆ | IF1, IF2, ELSEIF1, ELSEIF2, .ERR1, .ERR2のﾃﾞｨﾚｸﾃｨﾌﾞを含む。(IF1はIF、.ERR1は.ERRとして処理するように変更)
◆ | 条件文に前方参照を含む(処理ﾊﾟｽに依存する)。
◆ | .TYPE演算子に前方参照を含む。
◆ | ESC命令と.MSFLOATを含む。
以前のﾊﾞｰｼﾞｮﾝ用のｿｰｽ内容をできるだけ有効に利用し、変更を少なくするためには、MLｺﾏﾝﾄﾞ起動時ｵﾌﾟｼｮﾝ/ZmまたはOPTION M510を用います。.(ﾄﾞｯﾄ)で始まる識別子はできるだけﾄﾞｯﾄを使用しないものに変更します。また、加算の意味のﾄﾞｯﾄは使用できませんので、記号+に置き換えます。

 以前のﾊﾞｰｼﾞｮﾝのﾊﾞｸﾞ修正のために、現ﾊﾞｰｼﾞｮﾝでは、ｴﾗｰとして検出されるものがあります。例えば、PUBLIC文でﾊﾟﾌﾞﾘｯｸ･ｼﾝﾎﾞﾙに指定するﾗﾍﾞﾙとして、ﾛｰｶﾙ･ﾗﾍﾞﾙは指定できません。2個のｺﾛﾝを用いた形式のﾗﾍﾞﾙ定義に変更します。

 現ﾊﾞｰｼﾞｮﾝでの仕様の変更のために、ｴﾗｰとして検出されるものがあります。例えば、ﾃｷｽﾄ･ﾏｸﾛには前方参照を含められません。ｵﾌｾｯﾄの上位と下位の意味で、演算子のHIGHとL0Wを用いる場合、演算子OFFSETを併用する必要があります。また、16進数は符号なしとして処理されるため、符号付きの比較で結果が異なる場合があります。

 上記以外に、数多くの内部的な処理が変更されています。その大部分はOPTION文を利用することでｴﾗｰを避けられる可能性があります。このような問題を避けるためには、基本的に、一見便利な機能をできるだけ使わないようにすることです。これらの機能はﾊﾞｰｼﾞｮﾝｱｯﾌﾟによる変更の可能性が大きくなります。最低限の基本的な命令のみで構成されたﾌﾟﾛｸﾞﾗﾑは、ﾊﾞｰｼﾞｮﾝｱｯﾌﾟの影響もまた最小限となります。


項目概説

ﾃｷｽﾄ･ﾏｸﾛ@Cpuの返す値
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

ﾋﾞｯﾄ | 意味
11 | 80387 (80386/80486)
10 | 80287 (80286)
8 | 8087 (80186/8086)
7 | 特権命令
4 | 80486
3 | 80386
2 | 80286
1 | 80186
0 | 8086
注意: 上位ﾌﾟﾛｾｯｻを指定すると下位も選択されます。

ﾃｷｽﾄ･ﾏｸﾛ@Interfaceの返す値
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
OS | 予約済み |  |  |  | 言語型

OS | 意味
1 | OS/2
0 | MS-DOS
言語型 | 意味
000 | 予約済み
001 | C
010 | SYSCALL
011 | STDCALL
100 | PASCAL
101 | FORTRAN
110 | BASIC
111 | 予約済み

ﾃｷｽﾄ･ﾏｸﾛ@Modelの返す値
ﾒﾓﾘ･ﾓﾃﾞﾙを示す値を返します。
1 | TINY
2 | SMALL
3 | COMPACT
4 | MEDIUM
5 | LARGE
6 | HUGE
7 | FLAT